【问题标题】:how to check the size of input to avoid exceed DB column limit如何检查输入的大小以避免超出数据库列限制
【发布时间】: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 个字节,这可能会解释问题。

标签: oracle jsp encoding


【解决方案1】:

错误告诉你你已经给出了 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 */

【讨论】:

    【解决方案2】:

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

    SELECT LENGTHB ('é') 
       FROM DUAL;
    

    上面将返回 2。因此,无论您使用什么字符,您都可以指定类似 MY_VARCHAR_FIELD VARCHAR2(2 BYTES)

    【讨论】:

    • 不是 OP 试图在 进入数据库之前捕获这个吗?
    • 有没有办法在不调用 DB 的情况下做到这一点?
    • @DavidRuan 是的,请看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多