web-dev-qa-db-ja.com

COLLATION_CONNECTIONがutf8mb4_0900_as_csまたはutf8mb4_0900_ai_ciの場合、どのような違いがありますか

私のデフォルトのcollat​​ion_connectionは 'utf8_generic_ci'でしたが、ポーランド語の文字が合わないという問題が発生し、エラーが発生しました(テーブルにutf8mb4_0900_as_ciが含まれています)

そのため、コネクトをutf8mb4_0900_as_csに変更しましたが、パフォーマンス、マッチング、またはutf8エンコーディングを超えるデータが返されるかどうかはわかりません。
接続照合でciとcsの間に違いはありますか?

もちろん、列とテーブルの照合順序の違いは理解しています。

3
John

接続の照合順序を変更しても、パフォーマンスにはほとんど影響を与えませんだけでなく、達成したいことにも影響しますマニュアルから

collat​​ion_connectionは、リテラル文字列の比較にとって重要です。文字列と列の値を比較する場合、列には独自の照合があり、照合の優先順位が高いため、collat​​ion_connectionは重要ではありません。

大文字と小文字の区別の有無に関係なく比較を行う場合は、実際の列の照合を更新するか、手動ですべての比較に照合を強制する必要があります(例:WHERE)。後者は、インデックスが必要ない場合は影響が少ない可能性があり、比較と列が異なる照合を使用するためにインデックスの使用が妨げられる場合は影響が大きい可能性があります。

実際には:

mysql> SET NAMES utf8mb4; -- we will be using this charset to send literals
mysql> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
|         1 |
+-----------+
1 row in set (0.000 sec)

mysql> SET SESSION collation_connection = 'utf8mb4_bin';
Query OK, 0 rows affected (0.000 sec)

mysql> SELECT 'A' = 'a'; -- it works on literals, but you will have to force it manually on columns
+-----------+
| 'A' = 'a' |
+-----------+
|         0 |
+-----------+
1 row in set (0.000 sec)

mysql> MariaDB [(none)]> SELECT 'A' = 'a' COLLATE utf8mb4_bin; -- may prevent index usage on columns
+-------------------------------+
| 'A' = 'a' COLLATE utf8mb4_bin |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.000 sec)

mysql> select 'A' = 'a' COLLATE utf8mb4_unicode_520_ci;  -- may prevent index usage on columns
+------------------------------------------+
| 'A' = 'a' COLLATE utf8mb4_unicode_520_ci |
+------------------------------------------+
|                                        1 |
+------------------------------------------+
1 row in set (0.004 sec)
3
jynus