最近写了几段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程序增加截取来同样进行处理。
评论