ORA-12899 Ошибка Слишком большая строка для одного и того же столбца, но успешно разные таблицы

Я обновляю строку до столбца длиной 35 в двух таблицах

первое обновление таблицы прошло успешно, но вторая таблица выдает ошибку ORA ORA-12899 Ошибка слишком большая строка

select length('Andres Peñalver D1 Palmar Sani salt') bytes from dual;

     BYTES
----------
        35

select lengthb('Andres Peñalver D1 Palmar Sani salt') bytes from dual;

     BYTES
----------
        36

Поле colm1 обеих таблиц объявлено как VARCHAR(35), первое обновление таблицы завершилось неудачно, а второе - успешным.

update t
set colm1='Andres Peñalver D1 Palmar Sani Salt'
where value1='123456';

update t2
set colm1='Andres Peñalver D1 Palmar Sani Salt'
where value1='123456';

ORA-12899

select value from nls_database_parameters where parameter='NLS_CHARACTERSET';

VALUE                                                           
----------------------------------------------------------------
AL32UTF8

дайте мне знать, почему это поведение для этой таблицы, которая имеет тот же тип столбца

2 ответа

Решение

Проверьте фактический размер столбцов для обеих таблиц в all_tab_columns. 35 Char - это 3 раза по 35 байтов, и если один столбец таблицы определен в char, другой в байтах (во время ddl), размер будет другим. Обычные символы, такие как AZ az, занимают 1 байт для хранения, а символы для конкретных языков занимают 3 байта для хранения.

Полное сообщение об ошибке, как описано в документации сообщения об ошибке, должно дать вам ответ:

$ oerr ora 12899
12899, 00000, "value too large for column %s (actual: %s, maximum: %s)"
// *Cause: An attempt was made to insert or update a column with a value
//         which is too wide for the width of the destination column.
//         The name of the column is given, along with the actual width
//         of the value, and the maximum allowed width of the column.
//         Note that widths are reported in characters if character length
//         semantics are in effect for the column, otherwise widths are
//         reported in bytes.
// *Action: Examine the SQL statement for correctness.  Check source
//          and destination column data types.
//          Either make the destination column wider, or use a subset
//          of the source column (i.e. use substring).

Вероятно, это связано с семантикой длины символа.

Другие вопросы по тегам