Слишком длинные данные Ошибка для столбца типа Varchar (600) в db2 (версия для Windows и 10.0.22) - PullRequest
0 голосов
/ 24 октября 2019

Я установил размер столбца типа Varchar размером 600. Но я получаю приведенную ниже ошибку при обновлении таблицы.

[Code: -404, SQL State: 22001]  THE SQL STATEMENT SPECIFIES A STRING THAT IS TOO LONG. SQLCODE=-404, SQLSTATE=22001, DRIVER=4.25.1301

Я использую запрос на обновление, как показано ниже.

update test set description= <here i am passing the description of charachters length 600> where id=1;

Указанная выше ошибка не появляется, если я передаю описание количества символов 597 символов. Но ошибка появляется, если число символов превышает 597, даже если я установил размер столбца равным 600. Есть ли какое-то конкретное объяснение этому?

1 Ответ

2 голосов
/ 24 октября 2019

Быстрый тест:

db2 "create table varchar_test(c1 int, c2 varchar(10))"
db2 "insert into varchar_test values (1, '0123456789')"
DB20000I  The SQL command completed successfully.

, очевидно, я могу вставить сюда 10-байтовую строку. Но если бы я заменил последний символ многобайтовым UTF-символом «ą» (2 байта в utf-8), произойдет сбой:

db2 "insert into varchar_test values (2, '012345678ą')"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0433N  Value "012345678ą" is too long.  SQLSTATE=22001

с одним меньшим количеством, это нормально:

db2 "insert into varchar_test values (2, '01234567ą')"
DB20000I  The SQL command completed successfully.

так что я могу проверить сейчас:

db2 "select c1, length(c2) c2_len_bytes,CHARACTER_LENGTH(c2) c2_char_len, hex(c2) c2_hex from varchar_test" 

C1          C2_LEN_BYTES C2_CHAR_LEN C2_HEX              
----------- ------------ ----------- --------------------
          1           10          10 30313233343536373839
          2           10           9 3031323334353637C485

-> это подтверждает, что вторая строка имеет размер 10 байт, но имеет 9 символов. Я предлагаю повторить то же упражнение для самой длинной строки, которую вы можете уместить, и посмотреть, действительно ли у вас есть только однобайтовые символы в вашем VARCHAR. Для более подробного изучения символов utf-8 в базе данных Db2 вы можете просмотреть мой ответ здесь: Когда я импортирую данные гуджарати с использованием файла csv, эти временные данные выглядят как? (там нет ничего специфичного для Db2, просто обычный)Устранение неполадок utf-8 ")

...