2010-09-01 162 views
0

我正在处理可能适用或不适合我们的数据库的第三方用户数据。如果数据太长,则需要截断数据。截断字符串

我们使用IBatis和Connector/J。如果数据太长,则抛出SQL异常。我有两个选择:在Java中截断字符串或​​使用子字符串在sql中截断字符串。

我不喜欢在sql中截断字符串,因为我在我们的Ibatis XML中编写表结构,但另一方面SQL知道我们的数据库排序规则(这是不一致的,并且会使代码保持一致)并且可以以多字节安全方式截断字符串。

有没有办法让连接器/ J只是直接插入这个SQL,如果不是人们推荐的路线?

+1

您是如何导入数据的?我想知道是否可以在脚本自身的INSERT语句中截断文本...或者从第三方导出文本时是否可以截断文本? – 2010-09-01 19:54:30

+0

你的意思是在Ibatis?这就是我正在做的,我不喜欢它,因为我不得不将表结构写入插入语句,这应该是不可知论的。我没有实际导出第三方的数据,他们通过XML发送数据。我可以将它写入XSD,但如果时间太长,这会阻止他们首先发送数据。 我想要他们的数据,我只是需要截断它,如果它太长。 – stevebot 2010-09-01 20:12:33

回答

3

根据the MySQL documentation这可能是因为在插入超出长度可以作为警告被处理数据:

插入一个字符串转换为字符串 柱(CHAR,VARCHAR,TEXT,或BLOB) 超过该列的最大长度为 。该值被截断为 列的最大长度。

Connector/J属性之一是jdbcCompliantTruncation。这是its description

设置是否连接器/ J应该当数据被截断 抛出java.sql.DataTruncation 例外。 连接到支持警告的 服务器(MySQL 4.1.0及更高版本)时,JDBC 规范要求这样做。如果服务器sql-mode包含 STRICT_TRANS_TABLES,则此属性不起作用。请注意,如果未设置 STRICT_TRANS_TABLES,则将使用此 连接字符串选项将其设置为 。

如果我理解正确,那么将此属性设置为false不会引发异常,但会插入截断的数据。该解决方案不要求您截断程序代码或SQL语句中的数据,但将其委托给数据库。