为什么我的MySQL实例会认为“'”?和“ i”是相等的字符?

YWC*_*llo 3 mysql collation

我遇到了MySQL中的唯一性约束问题。我有两个不同的角色:

  • ? 这是ASCII十进制299
  • i 这是ASCII十进制109

为什么MySQL认为这些相等?当我运行以下命令时:

SELECT STRCMP('?', 'i')
Run Code Online (Sandbox Code Playgroud)

我得到的返回值为0

根据请求,以下是有关我的环境的一些信息:

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_unicode_ci   |
+--------------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

bis*_*hop 6

您的数据库默认默认不区分大小写:这是。ci结尾的部分@@collation_database。在这种校对中,对于大多数语言来说,变音符号被折叠。从文档:

为了进一步说明,utf8_general_ci和utf8_unicode_ci中都具有以下相等性(有关比较或搜索中的影响,请参见第10.8.6节“排序规则的影响示例”):

Ä=
AÖ=
OÜ= U

https://dev.mysql.com/doc/refman/8.0/zh-CN/charset-unicode-sets.html

除非您有这样做的理由,否则建议您更改此默认设置。