Быстрый тест:
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 ")