为什么这个字符序列比较会返回true?

时间:2017-04-12 12:22:37

标签: mysql collation mysql-5.7

以下SQL语句如何在MySQL中返回true

SELECT 'SeP' = 'sęp';

mysql> select 'SeP' = 'sęp';
+----------------+
| 'SeP' = 'sęp'  |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

我的数据库的字符集和整理如下。

mysql> select @@character_set_database, @@collation_database, @@collation_connection;
+--------------------------+----------------------+------------------------+
| @@character_set_database | @@collation_database | @@collation_connection |
+--------------------------+----------------------+------------------------+
| utf8mb4                  | utf8mb4_general_ci   | utf8_general_ci        |
+--------------------------+----------------------+------------------------+
1 row in set (0.00 sec)

2 个答案:

答案 0 :(得分:7)

你有一个不区分大小写(在排序规则名称的末尾ci表示这一点)和泛型排序规则,因此MySQL在不区分大小写的情况下比较2个字符串,通常是重音不敏感的方式,因此两个字符串是同样的。

Case sensitivity in string searches上的MySQL手册说:

  

对于非二进制字符串(CHAR,VARCHAR,TEXT),字符串搜索使用比较操作数的排序规则。对于二进制字符串(BINARY,VARBINARY,BLOB),比较使用操作数中字节的数值;这意味着对于字母字符,比较将区分大小写。

     

处理非二进制字符串和二进制字符串之间的比较   作为二进制字符串的比较。

     

简单的比较操作(> =,>,=,<,< =,排序和分组)   基于每个角色的“排序值”。字符与之相同   排序值被视为相同的字符。例如,如果e和é   在给定的排序规则中具有相同的排序值,它们相等。

要强制区分大小写,请使用区分大小写(_cs)或二进制排序规则(_bin)。要强制重音敏感度,您需要使用特定于语言的排序规则(在您的情况下为utf8mb4_polish_xxx)或二进制排序规则。通用排序规则很少区分重音字符和非重音字符。

答案 1 :(得分:0)

COLLATION utf8mb4_polish_ci会将这些视为“单独的字母”:ą ć ę ń ś ź ż

例如,a< ą< b。在大多数其他排序规则中,a = ą< b

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_polish_ci;

mysql> SELECT 'SeP' = 'sęp';
+----------------+
| 'SeP' = 'sęp'  |
+----------------+
|              0 |
+----------------+

有关各种排序规则有何不同的详细信息,请参阅this