我有一个全部为utf8_general_ci
字符集的 MySQL 数据库。
唯一的例外是subject
表newsletter
中具有 charset的字段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)我会收到对 url 之类的访问
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 表情符号的能力
?