我从网站接收大量数据,所有这些字符串值都需要添加到我们的数据库中。
在插入数据库期间 SQL 有时会抛出以下错误:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)
数据库表实际上设置为使用 Latin1。
用 json_encode() 对我的值进行编码后,我发现了这个错误发生的原因。表示字符串之间的一些特殊字符的 UTF 序列需要转换为它们的实际值:
编码字符串:candidate\u00e2\u0080\u0099s 个人情况
在本例中,序列 \u00e2\u0080\u0099 表示一个 '。
无论只有几个不同的序列,我也知道我想要/需要替换它们的值,但我正在努力转换。
我尝试了几种方法,但都没有成功,
使用 str_replace:
str_replace('\\u00e2\\u0080\\u0099', '\'', ($string));
没有改变字符串中的任何内容
使用 mb_functions:
$encodedStr = mb_convert_encoding($string, 'ASCII')
给我留下了一些神秘的东西??而不是 UTF 序列,但它不会引发数据库错误,但它仍然不是我需要的。
使用 preg_replace:
preg_replace('/\\u00e2\\u0080\\u0099/', '\'', $string)
抛出错误:PCRE 在偏移量 1 处不支持 \L、\l、\N{name}、\U 或 \u
我已经尝试了更多选项,但是当我开始强迫这个问题时,我想到了三个选项,我只是无法弄清楚为什么这些功能,特别是 str_replace 不能以预期的方式工作。