是否有允许表情符号和重音符号的 MySQL 字符集和编码?

McB*_*McB 3 mysql collation character-set encoding

我有一个术语数据库,由一组用户添加到其中,并由另一组用户查询。

\n\n

当人们在数据库中查询表情符号并且我的 React 应用程序会抛出错误(奇怪的是 CORS 错误,但这是一个不同的问题)时,我遇到了问题。我最终通过将表的字符集更改为utf8mb4带有utf8mb4_unicode_ci排序规则来解决这个问题。

\n\n

现在,我在添加新术语时遇到错误,例如,“beyonc\xc3\xa9”的重复行已存在。但是,当我在数据库中查询“beyonc\xc3\xa9”时,它返回其中包含“beyonce”的行。是否有字符集和排序规则的组合可以正确处理这个问题?

\n\n

我的数据库是在 Amazon RDS 上运行的 MySQL 5.6.40。

\n

Sol*_*zky 5

\n

当人们在数据库中查询表情符号并且我的 React 应用程序会抛出错误时,我遇到了问题

\n
\n\n

确切的错误消息是什么?utfmb4在将其更改为and之前,该列的字符集和排序规则是什么utf8mb4_unicode_ci?在 MySQL 中,可以在多个级别设置排序规则,包括客户端连接。

\n\n

也就是说,Unicode(utf8Unicode 编码之一)支持所有字符。如果您的字符集确实是utf8mb4,则无需更改。

\n\n

你说:

\n\n
\n

添加新术语时出现错误,例如“beyonc\xc3\xa9”的重复行已存在,但是当我在数据库中查询“beyonc\xc3\xa9”时,它返回带有“beyonce”的行“ 在里面。

\n
\n\n

MySQL文档指出:

\n\n
\n

对于未指定区分重音的非二进制排序规则名称,它由区分大小写决定。如果排序规则名称不包含_aior _as_ci则在名称暗示_ai_cs名称暗示中_as

\n
\n\n

因此,由于您的排序规则是utf8mb4_unicode_ci,那么它既不区分大小写,也不区分重音。这就是为什么“beyonc\xc3\xa9”与“beyonce”匹配。

\n\n

如果您需要将“beyonc\xc3\xa9”和“beyonce”视为不同,那么理想情况下您将使用区分大小写(以及明确声明或暗示区分重音)的排序规则。然而,看起来这在 MySQL 5.6(甚至 5.7)中不可用,而 MySQL 8.0 确实有utf8mb4_0900_as_cs, 或者即使utf8mb4_0900_as_ci您只想用重音来区分值,同时允许“beyonce”和“Beyonce”匹配。

\n\n

因此,目前看来您可能需要使用二进制排序规则 ,utf8mb4_bin方法是更改​​列的排序规则,或者添加COLLATE utf8mb4_bin到一个或多个查询。

\n