Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重音字符再加一个字符_Java_Database_Oracle_Character Encoding - Fatal编程技术网

Java 重音字符再加一个字符

Java 重音字符再加一个字符,java,database,oracle,character-encoding,Java,Database,Oracle,Character Encoding,我有以下问题: 我必须将插入表单内输入字段的数据存储在数据库中。我验证该输入中的数据不超过40个字符 问题是,如果我插入的文本有40个字符,但其中一个字符是重音符号,那么验证显然不会显示任何错误,但当它将存储在数据库中时,会引发以下异常: ORA-12899:列“DBUSER”“TABLE”“column”的值太大(实际值:41,最大值:40) 重音字符似乎占用了数据库中的多个字符 我想这与编码有关,但我不知道从哪里开始寻找。有什么想法吗 谢谢 用于列或使列的宽度至少为最长输入的六倍(一个Uni

我有以下问题:

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

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

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

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

我想这与编码有关,但我不知道从哪里开始寻找。有什么想法吗


谢谢

用于列或使列的宽度至少为最长输入的六倍(一个Unicode字符在UTF-8编码下最多可以变成6个字节)。

如@Adam Musch所建议,使用
CHAR
。您确实不想使用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。默认值由确定。使用此查询检查值:

select * from v$parameter where name = 'nls_length_semantics';
您可以使用以下语句更改默认值。(虽然您可能会忘记更改此参数,但显式更改更可靠 在DDL中使用
CHAR
。)

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

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

您的数据库的字符编码是什么?参数NLS_CHARACTERSET设置为AL32UTF8您可以发布用于验证输入的代码吗?另外,您可以给出问题字符的示例。UTF-8是Unicode。存在需要多个字节编码的有效unicode字符。看起来您已经找到了一个。@DwB:除非您将列声明为varchar2(40个字符)。NVARCHAR2肯定是一个不错的选择。当然,像这样切换数据类型并不是一个简单的过程。问题源于糟糕的设计:选择unicode字符集而不构建支持它的数据模型。这将是一个很好的时间来指出乔尔·斯波尔斯基(Joel Spolsky)的文章,他是SO:FWIW的守护神,我过去采取的方法是为一定比例的非ASCII字符预算。如果你正在建立一个可以处理多种欧洲语言的网站,那么你可能需要允许10%左右的字符被强调(在《世界报》头版的一篇文章中,我刚刚测量到它的3.4%;10%有足够的净空)。因此,如果您有一个40个字符的字段,则允许它为44字节。尽管说实话,考虑到Oracle和其他现代数据库存储字符串的方式,我可能只会将每个(n)varchar列声明为4000个字符长,并在应用程序层执行所有验证。
alter table my_table1 modify (small_string varchar2(1 char));