重音字符需要多一个字符

时间:2012-03-09 10:06:49

标签: java database oracle character-encoding

我有以下问题:

我必须在数据库中存储插入表单内输入字段的数据。我验证该输入中的数据不超过40个字符。

问题是,如果我插入一个包含40个字符但其中一个带有重音符号的文本,那么显然验证不会显示任何错误,但是当它将存储在数据库中时,会抛出以下异常:

ORA-12899:列“DBUSER”的值太大。“TABLE”。“COLUMN”(实际:41,最大值:40)

似乎重音字符占用了数据库中的多个字符。

我想这与编码有关,但我不知道从哪里开始查找。任何想法?

谢谢!

2 个答案:

答案 0 :(得分:4)

列的

Use NVARCHAR2 as type或使列至少是最长输入的六倍(使用UTF-8编码,一个Unicode字符最多可以变为6个字节)。

答案 1 :(得分:3)

使用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';

您可以使用以下语句更改默认值。 (虽然您可能忘记更改此参数,但显式更可靠 在您的DDL中使用CHAR。)

alter session set nls_length_semantics = char;

该设置不会更改现有对象,您需要使用SQL手动更改表格,如:

alter table my_table1 modify (small_string varchar2(1 char));