在utf8_general_ci中的MySQL数据库,在utf8mb4_general_ci中的连接,如何处理“排序规则的非法混合”?

时间:2019-02-05 15:04:13

标签: php mysql utf-8 character-encoding utf8mb4

我有一个全为utf8_general_ci字符集的MySQL数据库。

唯一的例外是subject表中具有字符集newsletter的字段utf8mb4_general_ci

这样做是为了允许存储表情符号utf8字符。

通过php脚本建立与我运行的数据库的连接

mysqli_set_charset($link, 'utf8mb4')

这样,我还可以显示utf8表情符号字符。

因此,我的网站公开了这样的网址:

https://example.org/my-slug
在以下查询中内部翻译的

SELECT * FROM page WHERE slug = 'my-slug'

问题在于有时(尤其是来自Bing,Microsoft IP)我会访问诸如此类的网址

https://example.org/my-slug%0cL%ce%0c%cd%cc%8c%8d%0cL
发起该查询的

SELECT * FROM page WHERE slug = 'my-slug^LL<CE>^L<CD>̌<8D>^LL'

由于错误而失败

PHP User Warning - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='

有没有办法解决此错误:

  • 不修改查询
  • 无需将所有数据库字符集从utf8_general_ci更改为utf8mb4_general_ci
  • 不丢失保存和显示utf8表情符号的能力

1 个答案:

答案 0 :(得分:0)

%0cL%ce%0c%cd%cc%8c%8d%0cL是乱码,不会映射到我测试过的任何字符集中的有意义的信息。

例如,

Shift-JIS将其解释为Lテヘフ訣L;这在日语中有意义吗?拉丁语1:LÃÍÌŒL。它会破坏utf8和utf8mb4。 Koi8r和koi8u Lцмл▄█L

该字符串的十六进制具有非常大的C0c4cc30ccdcc8c8d0c4c

如果必须处理这样的字符串,那么我建议您对列数据类型使用VARBINARYBLOB(取决于大小)。这样做的缺点是不进行大小写折叠,但这可能不相关。