最近寫了幾段PHP程序,給同事來導入數據到MySQL數據庫,同事偶爾反映遇到這樣類似的報錯:
PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'state' at row 1: UPDATE `table` SET `address` = 'xxx', `state` = '過長内容', `id` = '141124' WHERE `ziduan` = 'xxx';; Array
很明顯,這是某個需要導入的内容超過了字段設置的長度。處理的辦法:
- 如果這種情況極少,可以人工根據情況對導入内容進行縮減後再運行;
- 如果這種情況比較多,又覺得不用修改字段長度,也可以修改PHP程序來自動截取一定長度并導入;
- 如果這種情況太多,說明字段設置的長度太短,可以修改字段長度再運行。
第二種情況下,需要考慮截取多少長度,特别是包含中文字符、英文字符、标點符号、數字等情況下,如何設置截取長度是一個問題,之前對MySQL中的字符包含的字節沒有深究。
昨天詳細查看了資料并進行試驗:
MySQL中表使用了UTF-8 MB4字符集,假設某個字段長度設置為1024,那麼指的是1024個字符(可能是漢字、英文、标點或數字等),包含多少個字節是不定的。
PHP裡面substr是截取字符串的子字符串,參數是單個英文字符數,而中文字符串截取最好用mb_substr,這個函數不管字節數,各種字符(可能是漢字、英文、标點或數字等)都算一個字符。
于是就用mb_substr來截取$new_string = mb_substr($string, 0, 1024);來處理,再導入數據庫就沒有問題了,而且經過反複測試驗證,這樣的限制是準确的,多一個字符就不能導入,少一個字符就限制多了。
後面還有其它字段、其它程序遇到類似問題都可以修改PHP程序增加截取來同樣進行處理。
评论