2017-04-12 42 views
2

以下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) 
+0

我们必须看到规格,但我认为合理的是,两种字符在普通整理中被认为是相同的,不受任何特定语言的约束。 –

+0

您可以尝试使用CASE WHEN来实现此功能。 –

+0

@SagarGangwal @SagarGangwal你可以尝试,但它不会太多使用 – Shadow

回答

7

您有不敏感的情况下(在核对名称的末尾ci指示此)和通用整理,因此MySQL的的情况下的2个字符串比较不敏感,并且通常口音不敏感的方式,因此两个字符串一样。

MySQL手册上Case sensitivity in string searches说:

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

非二进制字符串和二进制字符串之间的比较将被视为 作为二进制字符串的比较。

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

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

+0

也许它不是直接可见的,但是在那里有一个特殊的波兰字符''。 – Jagger

+0

@Jagger - 这是可见的,但阴影是正确的。您使用的校对为您的波兰重音字符和拉丁字母“e”添加了相同的权重。 – Mjh

+0

@Mjh仍然添加了一些更多的解释,以明确排序规则将重音字符视为相同。答案的第一句过度集中在区分大小写。 – Shadow

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了解各种排序规则有何不同的详细信息。

+1

我错过了什么吗?或错误的东西?为什么downvote? –