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

问题描述 投票:0回答:1

我有一个MySQL数据库,这是所有在utf8_general_ci字符集。

唯一的例外是在具有字符集subjectnewsletter表中的字段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
  • 不失能够保存和显示UTF8的表情符号

?

php mysql utf-8 character-encoding utf8mb4
1个回答
0
投票

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

移-JIS,例如,将其解释为Lテヘフ訣L;这是否有意义日本? Latin1的:LÃÍÌŒL。它打破了UTF8和utf8mb4。 Koi8r和koi8uLцмл▄█L

该字符串的十六进制具有非同寻常的大量C的:0c4cc30ccdcc8c8d0c4c

如果你必须处理这样的字符串,那么我建议你使用VARBINARYBLOB(视大小而定)的列数据类型。这有没有做的情况下折叠的缺点,但也许这是不相关的。

© www.soinside.com 2019 - 2024. All rights reserved.