【发布时间】:2017-07-12 16:10:36
【问题描述】:
我的页面有一个 size=8 的输入字段。
而在DB中,对应的列是VARCHAR2(8)。
但是如果我在字段中输入一个长度为 8 且带有特殊 ascii 字符的字符串,我会得到以下异常。
ORA-12899: xxxx 列的值太大(实际:10,最大值:8)
我试图在验证器中捕捉到这一点,我检查了 myString.getBytes().length,它也是 8。
我知道一种解决方案是在 DB 端将列更改为 VARCHAR2(8 CHAR)。
还有其他解决方案可以在控制器中检查吗?
【问题讨论】:
-
"special ascii character" 没有意义-您的意思是多字节/ unicode字符,或者至少是非ASCII字符,对吗? ASCII 字符总是单字节的。
-
是的。我的意思是多字节/Unicode字符。实际上,我输入了一个汉字。
-
我相信字符的字节长度(至少有时)取决于字符集。因此,如果不知道至少 something 从 DB(即 DB 字符集),就不可能进行此检查。我不确定
myString.getBytes().length应该返回什么 - 如果不将字符集作为参数,它怎么知道?然后它将使用一些默认字符集(可能是操作系统字符集?) -
@mathguy - 它是the platform's default charset。它可以选择接受一个字符集参数,但不要认为这在这里有帮助。我认为 DB 字符集不应该与 Java/JSP 检查列是否定义为 8 个字节相关,问题暗示(因为 changed 到 8 char 是一个选项)?但是,如果
getBytes().length()仍然报告 8,似乎 Java/JSP 和 DB 之间可能存在一些意外转换,可能是由于字符集不匹配? -
@AlexPoole - 这就是我的意思。我不知道“平台”是什么意思,但是没有理由为什么平台字符集应该匹配 DB 字符集。如果同一个字符在平台字符集中是 1 个字节,但在 DB 中是 3 个字节,这可能会解释问题。