0

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

唯一的例外是subjectnewsletter中具有 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_ciutf8mb4_general_ci
  • 不会失去保存和显示 utf8 表情符号的能力

?

4

1 回答 1

0

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

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

该字符串的十六进制数异常多C0c4cc30ccdcc8c8d0c4c

如果您必须处理此类字符串,那么我建议您使用VARBINARYBLOB(取决于大小)作为列数据类型。这具有不进行大小写折叠的缺点,但也许这无关紧要。

于 2019-02-05T19:05:11.693 回答