JDBC - 自动收缩VARCHAR以适应

时间:2012-05-17 16:08:05

标签: mysql jdbc truncate

得到了这个例外:

Exception: Data truncation: Data too long for column 'subject' at row 1

此数据仅供显示,因此可以截断。

简单的做法是在逻辑中截断 - subject = subject.subString(0, 100) - 但这会将MySQL中的最大长度复制到Java中的硬编码数。 MySQL或JDBC中是否有任何功能(如果重要的话,我使用的是c3p0)会截断以自动适应吗?

3 个答案:

答案 0 :(得分:1)

  

如果未启用严格的SQL模式,并且您为CHAR或VARCHAR列分配的值超出了列的最大长度,则会截断该值以适应并生成警告。

(来自The CHAR and VARCHAR Types

如果您不介意将MySQL服务器模式更改为不严格,则不会抛出任何异常。

请参阅Server Modes

答案 1 :(得分:0)

使用定义宽度的列属性,而不是硬编码100。 你根本不关心它在数据库中存在多长时间,只是根据你的客户端长度定义它不会爆炸。

答案 2 :(得分:0)

插入时截断是一个异常,驱动程序需要抛出异常(DataTruncation);请参阅JDBC 4.1的第8.3节:

  

在写入数据源时发生数据截断时,a   抛出DataTruncation对象。已被截断的数据值可能   即使已生成警告,也已写入数据源。什么时候   数据截断发生在从数据源读取时,会报告SQLWarning。

还有一个静默截断(在语句上使用setMaxFieldSize(),但Javadoc只讨论ResultSet中的字段,因此不清楚它是否也应用于PreparedStatement上设置的参数。