Используйте CHAR
, как предложил @ Adam Musch. Вы действительно не хотите использовать NVARCHAR2 или догадываться о возможном количестве байтов.
create table my_table1(small_string varchar2(1 byte));
create table my_table2(small_string varchar2(1 char));
insert into my_table1 values('Þ'); --"ORA-12899: value too large for ..."
insert into my_table2 values('Þ'); --works fine
Вы можете явно установить семантику длины в BYTE или CHAR, но, скорее всего, вы используете значение по умолчанию, BYTE. Значение по умолчанию определяется NLS_LENGTH_SEMANTICS . Проверьте значение с помощью этого запроса:
select * from v$parameter where name = 'nls_length_semantics';
Вы можете изменить значение по умолчанию с помощью следующей инструкции. (Хотя вы, вероятно, забудете изменить этот параметр, более надежно явно
используйте CHAR
в вашем DDL.
alter session set nls_length_semantics = char;
Этот параметр не изменяет существующие объекты, вам нужно вручную изменить таблицу с помощью SQL, например:
alter table my_table1 modify (small_string varchar2(1 char));