Самый короткий вариант: , Живой На Coliru
std::string str(std::istreambuf_iterator{ifs}, {});
, Это требует заголовка
.
были некоторые отчеты, что этот метод медленнее, чем предварительное выделение строки и использование std::istream::read
. Однако на современном компиляторе с оптимизациями, включенными, это больше, кажется, не имеет место, хотя относительная производительность различных методов, кажется, высоко зависимый компилятора.
NUMBER (7, 0)
просто ограничивает область значений.
Их внутренние представления не отличаются:
CREATE TABLE t_pk (col1 NUMBER(7, 0) NOT NULL, col2 NUMBER(38) NOT NULL)
INSERT
INTO t_pk
VALUES (9999999, 9999999)
SELECT DUMP(col1), DUMP(col2)
FROM t_pk
DUMP(col1) DUMP(col2)
--- ---
Typ=2 Len=5: 196,10,100,100,100 Typ=2 Len=5: 196,10,100,100,100
В Oracle
, ЧИСЛО
хранятся в виде сотенных цифр числового значения, нормализованного до 0,01 <= N <1
и предваренного показателем степени.
В приведенном выше примере:
196
- экспонента на основе 192
( 4
). 10
десятичное 9
100
десятичное 99
Целое число читается в десятичном виде как 00.09 99 99 99 * (100 ^ 4) = 9,999,999
Чем больше цифр требуется для обеспечения требуемой точности, тем больше их будет
Когда вы вставляете точное значение в менее точный столбец, оно просто округляется до столбца 's точности и сохраняется с округлением.
Следовательно, с точки зрения производительности можно объявить столбец NUMBER (38)
, поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0)
(для чисел, соответствующих обоим типам).
Однако, если ваши PRIMARY KEY
по своей природе целочисленные, вам лучше указать точность как 0
, чтобы убедиться, что дробное значение отсутствует. когда-либо попадет в вашу таблицу.
Обновление:
@Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вы должны сделать свой номер НОМЕР (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
NUMBER (38)
, поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0)
(для чисел, соответствующих обоим типам).
Однако, если ваши PRIMARY KEY
являются целыми по своей природе, вам лучше указать точность как 0
, чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.
Обновление:
@Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вы должны сделать свой номер НОМЕР (9)
или меньше (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
NUMBER (38)
, поскольку это не подразумевает накладных расходов сверх NUMBER (7, 0)
(для чисел, соответствующих обоим типам).
Однако, если ваши PRIMARY KEY
целочисленные по своей природе, вам лучше указать точность как 0
, чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.
Обновление:
@Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вы должны сделать свой номер НОМЕР (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
Однако, если ваши PRIMARY KEY
являются целыми по своей природе, вам лучше указать точность как 0
, чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.
Обновление:
@Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вам следует сделать свой номер ] НОМЕР (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
Однако, если ваши PRIMARY KEY
являются целыми по своей природе, вам лучше указать точность как 0
, чтобы гарантировать, что дробное значение никогда не попадет в вашу таблицу.
Обновление:
@Mac также указал, что клиенты могут полагаться на тип данных столбца для определения домена значений.
Если ваше приложение ожидает INT32
, вы должны сделать свой номер ] НОМЕР (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
Если ваше приложение ожидает INT32
, вы должны сделать свой номер NUMBER (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
Если ваше приложение ожидает INT32
, вы должны сделать свой номер NUMBER (9)
или ниже (или любой другой тип, который ваш клиент считает конвертируемым в Int32
).
Что касается проблемы с базой данных, мне не к чему добавить Ответ Квассноя .
Но стоит отметить, что это может также повлиять на приложения, которые обращаются к базе данных (или, точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).
Но стоит отметить, что это также может повлиять на приложения, которые обращаются к базе данных (или, чтобы быть точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).
Но стоит отметить, что это может также повлиять на приложения, которые обращаются к базе данных (или, точнее, на разработчиков этих приложений). Например, в .NET, если вы получите IDataRecord , включая ваш первичный ключ (с использованием ODP .NET), вызов GetInt32 завершится неудачно, если ваш столбец определен как NUMBER (38 ) и успешно, если задано как ЧИСЛО (7) (даже если значение находится в правильном диапазоне).
Если вы не ожидаете большего, скажем, 100К записей в в таблице, если вы укажете PK с помощью N (7,0), вы получите раннее предупреждение, если какой-то неконтролируемый процесс закончится переполнением PK.