今天Linux上用PHP做采集入库遇到了mysql的报错:SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF4\x8F\xB1\x82\xF4\x8F...' for column 'content' at row 1
远程mysql版本为5.7;
通过排查发现是内容中有特殊字符,按照网上的方式把数据库和表的字符集改为:utf8mb4 没用,问题依旧。
在本地Windows上测试没有报错,但插入的内容是不完整的;特殊字符后面的内容是被截断了的
那么就在插入之前再用程序过滤吧,虽然这样有损效率;
PHP过滤特殊字符代码:
/** * 过滤字符串,保留UTF8字母数字中文及部份符号 * www.timeblog.cn * @param String $ostr * @return String */ public function filter_utf8_char($ostr){ preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$ostr,$matches); $str=join('', $matches[0]); /*含有特殊字符需要逐个处理*/ if($str==''){ $returnstr=''; $i=0; $str_length=strlen($ostr); while($i<=$str_length){ $temp_str=substr($ostr,$i,1); $ascnum=Ord($temp_str); if($ascnum>=224){ $returnstr=$returnstr.substr($ostr,$i,3); $i=$i+3; }elseif($ascnum>=192){ $returnstr=$returnstr.substr($ostr,$i,2); $i =$i+2; }elseif($ascnum>=65 && $ascnum<=90){ $returnstr=$returnstr.substr($ostr,$i,1); $i=$i+1; /*特殊字符*/ }elseif($ascnum>=128 && $ascnum<=191){ $i=$i+1; }else{ $returnstr=$returnstr.substr($ostr,$i,1); $i=$i+1; } } $str=$returnstr; preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$str,$matches); $str=join('',$matches[0]); } return $str; }
问题解决;
如果还有更好的解决办法请赐教!
转载请注明本文标题和链接:《 PHP采集入库对内容中的特殊字符处理 》
稳了稳了