当前位置

PHP截取字符长度导入MySQL限长的字段

James Qi 在 2018年12月23日 - 00:17 提交

  最近写了几段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

  很明显,这是某个需要导入的内容超过了字段设置的长度。处理的办法:

  1. 如果这种情况极少,可以人工根据情况对导入内容进行缩减后再运行;
  2. 如果这种情况比较多,又觉得不用修改字段长度,也可以修改PHP程序来自动截取一定长度并导入;
  3. 如果这种情况太多,说明字段设置的长度太短,可以修改字段长度再运行。

  第二种情况下,需要考虑截取多少长度,特别是包含中文字符、英文字符、标点符号、数字等情况下,如何设置截取长度是一个问题,之前对MySQL中的字符包含的字节没有深究。

  昨天详细查看了资料并进行试验:

  MySQL中表使用了UTF-8 MB4字符集,假设某个字段长度设置为1024,那么指的是1024个字符(可能是汉字、英文、标点或数字等),包含多少个字节是不定的。

  PHP里面substr是截取字符串的子字符串,参数是单个英文字符数,而中文字符串截取最好用mb_substr,这个函数不管字节数,各种字符(可能是汉字、英文、标点或数字等)都算一个字符。

  于是就用mb_substr来截取$new_string = mb_substr($string, 0, 1024);来处理,再导入数据库就没有问题了,而且经过反复测试验证,这样的限制是准确的,多一个字符就不能导入,少一个字符就限制多了。

  后面还有其它字段、其它程序遇到类似问题都可以修改PHP程序增加截取来同样进行处理。

自由标签:

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。