我有一个全部位于utf8_general_ci字符集中的MySQL数据库。

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

这样做是为了允许存储emoji 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表情符号的功能


最佳答案

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

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

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

如果必须处理此类字符串,那么建议您对列数据类型使用VARBINARYBLOB(取决于大小)。这样做的缺点是不折叠表壳,但这可能并不重要。

10-06 16:19
查看更多