2010-09-01 159 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語句中的數據,但將其委託給數據庫。