Получение ORA-12899: Значение слишком большой ошибки для nvarchar2 и varchar2 в Oracle
Я создал 2 таблицы и вставил данные, как показано ниже ---
SQL> create table t (aa nvarchar2(10));
Table created.
SQL> create table t1 (aa varchar2(10));
Table created.
Теперь вставим несколько французских символов, как показано ниже:
SQL> insert into t values ('Éé, Eè, Eê, Eë');
insert into t values ('Éé, Eè, Eê, Eë')
*
ERROR at line 1:
ORA-12899: value too large for column "CDUREFDB"."T"."AA" (actual: 14, maximum:
10)
SQL> insert into t1 values ('Éé, Eè, Eê, Eë');
insert into t1 values ('Éé, Eè, Eê, Eë')
*
ERROR at line 1:
ORA-12899: value too large for column "CDUREFDB"."T1"."AA" (actual: 21,
maximum: 10)
Вопрос в том, почему существует разница в сообщении об ошибке в обеих вставках.
Ниже приведено подробное описание параметров NLS:
SQL> SELECT *
2 FROM v$nls_parameters
3 WHERE parameter LIKE '%CHARACTERSET'
4 ;
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_CHARACTERSET
AL32UTF8
NLS_NCHAR_CHARACTERSET
UTF8
И я использую Oracle 11g
версия.
Кроме того, рекомендуется использовать NVARCHAR2(NCHAR etc.)
для неанглийских символов в оракуле?
Благодарю.
1 ответ
Если вы спрашиваете, почему "фактическое" значение в сообщении об ошибке отличается, ответом является семантика длины.
Когда вы объявляете nvarchar2(n)
, вы неявно используете семантику длины символа. nvarchar2(n)
выделяет место для n символов в nls_nchar_characterset
независимо от количества байтов, которое требуется. Вы пытаетесь вставить 14-символьную строку в nvarchar2(10)
Таким образом, вы получите 14 в качестве фактической длины ошибки.
Когда вы объявляете varchar2(n)
вы будете выделять пространство для хранения n байтов или n символов в зависимости от сеанса nls_length_semantics
, По умолчанию это byte
так что вы бы выделить место для 10 байтов. Некоторые из ваших персонажей требуют более 1 байта памяти в вашем nls_characterset
поэтому ваша строка из 14 символов потребует 21 байт памяти. Вот почему вы получаете 21 в качестве фактической длины в ошибке. Я ожидаю, что если вы объявите столбец как varchar2(n char)
используя семантику длины символа, сообщаемая фактический размер будет 14.
Если ваш набор символов базы данных поддерживает Unicode, очень редко есть причина использовать nvarchar2
, Когда ваша база данных и набор национальных символов - UTF-8, нет смысла когда-либо использовать nvarchar2
,