我有一个MySQL数据库,这是所有在utf8_general_ci
字符集。
唯一的例外是在具有字符集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'
问题是,有时(expecially从必应,微软IPS)我接受访问的网址一样
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
?
%0cL%ce%0c%cd%cc%8c%8d%0cL
是乱码,不映射到我已经测试的任何字符集的有意义的信息。
移-JIS,例如,将其解释为Lテヘフ訣L
;这是否有意义日本? Latin1的:LÃÍÌŒL
。它打破了UTF8和utf8mb4。 Koi8r和koi8uLцмл▄█L
。
该字符串的十六进制具有非同寻常的大量C
的:0c4cc30ccdcc8c8d0c4c
如果你必须处理这样的字符串,那么我建议你使用VARBINARY
或BLOB
(视大小而定)的列数据类型。这有没有做的情况下折叠的缺点,但也许这是不相关的。