我有以下问题:
我必须在数据库中存储插入表单内输入字段的数据。我验证该输入中的数据不超过40个字符。
问题是,如果我插入一个包含40个字符但其中一个带有重音符号的文本,那么显然验证不会显示任何错误,但是当它将存储在数据库中时,会抛出以下异常:
ORA-12899:列“DBUSER”的值太大。“TABLE”。“COLUMN”(实际:41,最大值:40)
似乎重音字符占用了数据库中的多个字符。
我想这与编码有关,但我不知道从哪里开始查找。任何想法?
谢谢!
答案 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));