Oracle 如何检查输入的大小以避免超过DB列限制

Oracle 如何检查输入的大小以避免超过DB列限制,oracle,jsp,encoding,Oracle,Jsp,Encoding,我的页面有一个大小为8的输入字段 在DB中,对应的列是VARCHAR2(8) 但是,如果我在字段中输入一个长度为8且带有特殊ascii字符的字符串,我将得到以下异常 ORA-12899:列xxxx的值太大(实际值:10,最大值:8) 我试图在验证器中捕获它,我检查myString.getBytes().length,它也是8 我知道有一种解决方案是在DB端将列更改为VARCHAR2(8个字符) 是否有其他解决方案可以在控制器中检查此问题 这会对您有所帮助,它将返回以字节为单位的实际大小 SELE

我的页面有一个大小为8的输入字段

在DB中,对应的列是VARCHAR2(8)

但是,如果我在字段中输入一个长度为8且带有特殊ascii字符的字符串,我将得到以下异常

ORA-12899:列xxxx的值太大(实际值:10,最大值:8)

我试图在验证器中捕获它,我检查myString.getBytes().length,它也是8

我知道有一种解决方案是在DB端将列更改为VARCHAR2(8个字符)


是否有其他解决方案可以在控制器中检查此问题

这会对您有所帮助,它将返回以字节为单位的实际大小

SELECT LENGTHB ('é') 
   FROM DUAL;

上面将返回2。因此,无论您使用的是什么字符,都可以指定类似于
MY\u VARCHAR\u FIELD VARCHAR2(2字节)

的内容,这将以字节为单位返回实际大小

SELECT LENGTHB ('é') 
   FROM DUAL;

上面将返回2。因此,无论您使用的是什么字符,都可以指定类似于
MY\u VARCHAR\u FIELD VARCHAR2(2字节)

的内容。错误告诉您已指定10个字节,但列只允许8个字节。我假设它是字节,因为您使用了中文字符集。因此,我认为该列是像VARCHAR2(8字节)一样创建的

如果你描述一下这张桌子,你就会知道发生了什么。将该描述与此描述进行比较:

create table x (a varchar2(30), b varchar2(30 byte), c varchar2(30 char));
为获取字节数而执行的代码几乎是正确的。而不是:

myString.getBytes().length   /* this probably returns 8 */
您需要执行以下操作:

myString.getBytes("UTF-8").length /* this probably returns 10 */

错误是告诉您已给定10个字节,但该列只允许8个字节。我假设它是字节,因为您使用了中文字符集。因此,我认为该列是像VARCHAR2(8字节)一样创建的

如果你描述一下这张桌子,你就会知道发生了什么。将该描述与此描述进行比较:

create table x (a varchar2(30), b varchar2(30 byte), c varchar2(30 char));
为获取字节数而执行的代码几乎是正确的。而不是:

myString.getBytes().length   /* this probably returns 8 */
您需要执行以下操作:

myString.getBytes("UTF-8").length /* this probably returns 10 */

“特殊ascii字符”没有意义——你是指多字节/unicode字符,或者至少是非ascii字符,对吗?ASCII字符始终为单字节。是。我指的是多字节/unicode字符。实际上,我输入了一个汉字。我相信字符的字节长度(至少有时)取决于字符集。因此,在不了解数据库中的某些信息(即数据库字符集)的情况下,不可能执行此检查。我不确定myString.getBytes().length应该返回什么-如果不将字符集作为参数,它怎么知道?然后它将出现在某个默认字符集中(可能是操作系统字符集?)@mathguy-是的。它可以选择接受一个字符集参数,但不要认为这在这里有用。我不认为DB字符集应该与Java/JSP检查相关,如果列定义为8字节,这一问题暗示了这一点(因为更改为8字符是一个选项)?但是,如果
getBytes().length()
报告的是8,那么Java/JSP和DB之间可能会出现一些意外的转换,这可能是由于字符集不匹配造成的?@AlexPoole-这就是我的意思。我不知道“平台”是什么意思,但没有理由让平台字符集与DB字符集匹配。如果相同的字符在平台字符集中是一个字节,但在数据库中是3个字节,这可能解释了问题。“特殊ascii字符”没有意义-您指的是多字节/unicode字符,或者至少是非ascii字符,对吗?ASCII字符始终为单字节。是。我指的是多字节/unicode字符。实际上,我输入了一个汉字。我相信字符的字节长度(至少有时)取决于字符集。因此,在不了解数据库中的某些信息(即数据库字符集)的情况下,不可能执行此检查。我不确定myString.getBytes().length应该返回什么-如果不将字符集作为参数,它怎么知道?然后它将出现在某个默认字符集中(可能是操作系统字符集?)@mathguy-是的。它可以选择接受一个字符集参数,但不要认为这在这里有用。我不认为DB字符集应该与Java/JSP检查相关,如果列定义为8字节,这一问题暗示了这一点(因为更改为8字符是一个选项)?但是,如果
getBytes().length()
报告的是8,那么Java/JSP和DB之间可能会出现一些意外的转换,这可能是由于字符集不匹配造成的?@AlexPoole-这就是我的意思。我不知道“平台”是什么意思,但没有理由让平台字符集与DB字符集匹配。如果同一个字符在平台字符集中是一个字节,但在数据库中是3个字节,这也许可以解释问题。OP在进入数据库之前是否试图捕捉到这一点?有没有办法不调用数据库就捕捉到它?@DavidRuan Yes,请看我的答案。OP在进入数据库之前是否试图捕捉到这一点?有没有一种方法可以在不调用DB的情况下执行此操作?@DavidRuan是的,请看我的答案。