Согласно спецификации VARCHAR2(max_size CHAR)
должен хранить max_size
символов. Я наблюдаю другое/странное поведение для текстов Unicode.
Рассмотрим этот пример:
create table test (id varchar2(3 char) not null, primary key (id));
insert into test(id) values('abc');
insert into test(id) values('ффф');
Query 1 ERROR: ORA-12899: value too large for column "TEST"."TEST"."ID" (actual: 6, maximum: 3)
Итак, 3 символа varchar2 на самом деле означают то же самое, что и байт? НЕТ :)
create table test (id varchar2(3 byte) not null, primary key (id))
insert into test(id) values('abc')
insert into test(id) values('ффф')
Query 1 ERROR: ORA-12899: value too large for column "TEST"."TEST"."ID" (actual: 18, maximum: 3)
И у меня остается вопрос, как сообщить Oracle, что длина varchar2 предназначена для текста Unicode (точнее, UTF8)?
Обновление: можно ли записать SQL-запрос, который покажет все таблицы/столбцы, длина которых указана в байтах?
На самом деле, моя проблема разделена на 2 части: неправильная кодировка запроса TablePlus, длина в байтах (без суффикса char) для случайных столбцов :)
Обновление 2: спасибо @Wernfried Domscheit!
Запрос показывает таблицу и столбцы с varchar2
, длина которых указана в byte
s:
SELECT TABLE_NAME, COLUMN_NAME, DATA_LENGTH, CHAR_USED
FROM USER_TAB_COLUMNS WHERE DATA_TYPE = 'VARCHAR2' AND CHAR_USED = 'B'