2017-04-12 5 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

あなたが試すことができますが、あなたは '@@ collat​​ion_connectionのを選択になるはずです@Jaggerそれは多くの使用 – Shadow

答えて

7

ため、2つの文字列がある、あなたは、大文字と小文字を区別しません(照合名の末尾にciこのことを示す)があり、一般的な照合は、したがって、MySQLはケースに小文字を区別しない2つの文字列を比較し、通常はアクセントを区別しない方法同じ。 Case sensitivity in string searches

MySQLのマニュアルは言う:非バイナリ文字列の

(CHAR、VARCHAR、TEXT)、文字列検索、比較オペランドの照合を使用します。バイナリ文字列(BINARY、VARBINARY、BLOB)の場合、比較はオペランドのバイトの数値を使用します。つまり、アルファベット文字の場合は、大文字と小文字が区別されます。非バイナリストリングとバイナリ列と

比較は、バイナリストリングの比較として 扱われます。

単純な比較演算(> =、>、=、<、< =、ソート、およびグループ化) は、各キャラクタのに基づいて、「ソート値。」同じ ソート値を持つ文字が同じ文字として扱われます。たとえば、eとé が特定の照合順序で同じソート値を持つ場合、それらは等しいと比較されます。

大文字と小文字を区別(_cs)またはバイナリ照合(_bin)のいずれかを使用して大文字と小文字の区別を強制します。アクセントの感度を強制するには、言語固有の照合(あなたの場合はutf8mb4_polish_xxx)またはバイナリ照合を使用する必要があります。一般的な照合では、アクセント付きの文字とアクセントなしの文字はほとんど区別されません。たとえば、ą ć ę ń ś ź ż

a < ą < b

+0

たぶんそれは直接目に見えないかもしれないが、そこには特別なポーランド語の文字「え」がある。 – Jagger

+0

@Jagger - それは目に見えますが、影は正しいです。あなたが使用する照合は、あなたのポーランド語アクセント付き文字とラテン文字「e」に同じ重みを付け加えます。 – Mjh

+0

@Mjhでは、照合でアクセント記号付きの文字が同じものとして扱われることを明確にするために、いくつかの説明が追加されています。答えの最初の文は、大文字と小文字の区別に焦点をあてすぎていました。 – Shadow

0

COLLATION utf8mb4_polish_ciは、 "個別の手紙" として、これらを扱います。 最もその他の照合で、a = ą < b

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_polish_ci; 

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

は、さまざまな照合順序が異なる方法の詳細についてthisを参照してください。

+1

私は何かが恋しいですか?または何かを間違っている?なぜdownvote? –

関連する問題