【问题标题】:VARCHAR does not work as expected in Apache DerbyVARCHAR 在 Apache Derby 中无法按预期工作
【发布时间】:2010-05-18 15:34:33
【问题描述】:

我有this same problem:

如何将 VARCHAR 截断为 表字段长度自动输入 德比使用 SQL?

具体来说:

创建表 A ( B VARCHAR(2) ); 插入 A B 值('1234');将 抛出 SQLException:

遇到截断错误 试图将 VARCHAR '123' 缩小到 长度 2。

已经回答了:

没有。你应该砍掉它之后 检查元数据。或者如果你 不想检查元数据 每次,那么你必须保持两者 您的代码和数据库同步。但 这没什么大不了的,这是正常的 在验证器中练习。

但我的疑问是:VARCHAR 不应该改变其大小以适应数据吗? apache derby 的 VARCHAR 有什么问题?

【问题讨论】:

    标签: java sql derby varchar


    【解决方案1】:

    VARCHAR 类型可变长度,但您在其定义中提供的数字是您允许它拥有的最大字符数。

    VARCHAR(2) 将存储 0-2 个字符的值,而 CHAR(2) 将存储 2 个字符,而不管它实际拥有什么数据。

    旁注:一旦达到 255 个字符,请考虑改用 TEXT 类型。

    【讨论】:

    • 根据 Derby 文档,它不支持 TEXT 类型,但 LONG VARCHAR 可能有意义。想法?
    【解决方案2】:

    不,你所描述的与此无关:varchar 不会用空格填充,char 会用空格填充

    如果你有

    CREATE TABLE A ( B VARCHAR(20) ); INSERT INTO A B VALUES ('1234')
    

    它将使用 4 个字节而不是 20 个字节,但是您不能在该列中容纳超过 20 个字符,要么在插入之前检查,要么使用类似 LEFT(val,2) 函数的东西

    但话说回来,您是否不想知道您的数据不合适并被截断。毕竟最重要的是您的数据...如果您的数据有问题,您将一无所有

    在 SQL Server 中,您可以使用一个设置,它会为您执行此操作,请参阅Suppress string or binary data would be truncated messages with the ANSI WARNINGS setting

    基本上你需要 SET ANSI_WARNINGS OFF 但我不知道这是否适用于你的数据库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2012-02-19
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      • 2020-09-21
      • 2011-08-17
      相关资源
      最近更新 更多