акцентированный персонаж берет еще один символ - PullRequest
3 голосов
/ 09 марта 2012

У меня следующая проблема:

Я должен сохранить в базе данных данные, которые вставляются в поле ввода внутри формы.Я подтверждаю, что данные в этом входе не превышают 40 символов.

Проблема в том, что если я вставлю текст, содержащий 40 символов, но один из них будет акцентирован, то, очевидно, проверка не показываетошибки, но когда он будет сохранен в базе данных, выдается следующее исключение:

ORA-12899: слишком большое значение для столбца "DBUSER". "TABLE". "COLUMN" (фактическое значение: 41, максимум: 40)

кажется, что акцентированный символ занимает больше чем один символ в базе данных.

Я думаю, это связано с кодировкой, но я понятия не имею, с чего начать.есть идеи?

спасибо !!

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Используйте NVARCHAR2 в качестве типа для столбца или сделайте столбец, по крайней мере, в шесть раз шире самого длинного ввода (один символ Unicode может стать максимум 6 байтами с кодировкой UTF-8).

3 голосов
/ 11 марта 2012

Используйте 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...