我有一个全为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
?
答案 0 :(得分:0)
%0cL%ce%0c%cd%cc%8c%8d%0cL
是乱码,不会映射到我测试过的任何字符集中的有意义的信息。
Shift-JIS将其解释为Lテヘフ訣L
;这在日语中有意义吗?拉丁语1:LÃÍÌŒL
。它会破坏utf8和utf8mb4。 Koi8r和koi8u Lцмл▄█L
。
该字符串的十六进制具有非常大的C
:0c4cc30ccdcc8c8d0c4c
如果必须处理这样的字符串,那么我建议您对列数据类型使用VARBINARY
或BLOB
(取决于大小)。这样做的缺点是不进行大小写折叠,但这可能不相关。