MariaDB #4:照合順序

MariaDBでデータベースを作成する際に照合順序という用語が出てくる。 照合順序とは?

※ 前回記事:#3:文字セット


照合順序とは

簡単に言えば、ソートや結合する際のルールをどうするか?ということらしい。
ルールとは、"大文字・小文字を区別するか?" や "半角・全角を区別するか?" など

照合順序の一覧

照合順序の一覧は "SHOW COLLATION;" で確認できるが、
照合順序は文字セット単位に存在し結構な数があるので、文字セットで絞り込んだ方が良い。
例えば utf8mb4 の文字セットを使う場合は "SHOW COLLATION WHERE CHARSET='utf8mb4';" とすれば良い。
MariaDB [(none)]> SHOW COLLATION WHERE CHARSET='utf8mb4';
+------------------------------+---------+------+---------+----------+---------+
| Collation                    | Charset | Id   | Default | Compiled | Sortlen |
+------------------------------+---------+------+---------+----------+---------+
| utf8mb4_general_ci           | utf8mb4 |   45 | Yes     | Yes      |       1 |
| utf8mb4_bin                  | utf8mb4 |   46 |         | Yes      |       1 |
| utf8mb4_unicode_ci           | utf8mb4 |  224 |         | Yes      |       8 |
| utf8mb4_icelandic_ci         | utf8mb4 |  225 |         | Yes      |       8 |
| utf8mb4_latvian_ci           | utf8mb4 |  226 |         | Yes      |       8 |
| utf8mb4_romanian_ci          | utf8mb4 |  227 |         | Yes      |       8 |
| utf8mb4_slovenian_ci         | utf8mb4 |  228 |         | Yes      |       8 |
| utf8mb4_polish_ci            | utf8mb4 |  229 |         | Yes      |       8 |
| utf8mb4_estonian_ci          | utf8mb4 |  230 |         | Yes      |       8 |
| utf8mb4_spanish_ci           | utf8mb4 |  231 |         | Yes      |       8 |
| utf8mb4_swedish_ci           | utf8mb4 |  232 |         | Yes      |       8 |
| utf8mb4_turkish_ci           | utf8mb4 |  233 |         | Yes      |       8 |
| utf8mb4_czech_ci             | utf8mb4 |  234 |         | Yes      |       8 |
| utf8mb4_danish_ci            | utf8mb4 |  235 |         | Yes      |       8 |
| utf8mb4_lithuanian_ci        | utf8mb4 |  236 |         | Yes      |       8 |
| utf8mb4_slovak_ci            | utf8mb4 |  237 |         | Yes      |       8 |
| utf8mb4_spanish2_ci          | utf8mb4 |  238 |         | Yes      |       8 |
| utf8mb4_roman_ci             | utf8mb4 |  239 |         | Yes      |       8 |
| utf8mb4_persian_ci           | utf8mb4 |  240 |         | Yes      |       8 |
| utf8mb4_esperanto_ci         | utf8mb4 |  241 |         | Yes      |       8 |
| utf8mb4_hungarian_ci         | utf8mb4 |  242 |         | Yes      |       8 |
| utf8mb4_sinhala_ci           | utf8mb4 |  243 |         | Yes      |       8 |
| utf8mb4_german2_ci           | utf8mb4 |  244 |         | Yes      |       8 |
| utf8mb4_croatian_mysql561_ci | utf8mb4 |  245 |         | Yes      |       8 |
| utf8mb4_unicode_520_ci       | utf8mb4 |  246 |         | Yes      |       8 |
| utf8mb4_vietnamese_ci        | utf8mb4 |  247 |         | Yes      |       8 |
| utf8mb4_croatian_ci          | utf8mb4 |  608 |         | Yes      |       8 |
| utf8mb4_myanmar_ci           | utf8mb4 |  609 |         | Yes      |       8 |
| utf8mb4_thai_520_w2          | utf8mb4 |  610 |         | Yes      |       4 |
| utf8mb4_general_nopad_ci     | utf8mb4 | 1069 |         | Yes      |       1 |
| utf8mb4_nopad_bin            | utf8mb4 | 1070 |         | Yes      |       1 |
| utf8mb4_unicode_nopad_ci     | utf8mb4 | 1248 |         | Yes      |       8 |
| utf8mb4_unicode_520_nopad_ci | utf8mb4 | 1270 |         | Yes      |       8 |
+------------------------------+---------+------+---------+----------+---------+
33 rows in set (0.001 sec)
照合順序は、文字セット名に続き"言語名"が入るが、日本語の照合順序は存在しないので、
"general"、"bin"、"unicode" のいづれかを使うことになる。
・utf8mb4_general_ci
・utf8mb4_bin
・utf8mb4_unicode_ci
・utf8mb4_unicode_520_ci
・utf8mb4_general_nopad_ci
・utf8mb4_nopad_bin
・utf8mb4_unicode_nopad_ci
・utf8mb4_unicode_520_nopad_ci

"bin" - 英字大小文字を区別したい場合は "bin" を選択する。
bin(バイナリ比較)は英字以外のすべての文字においても厳密に区別する。
あいまい検索を行いたい、といった特別な理由が無ければ、これで良いのでは?と思う。

"general" と "unicode" - 日本語の濁音・半濁音を区別する場合は"general"を使う。
また、ひらがなカタカナ、数字と丸数字 といった文字も "unicode" では同一とみなされる。
日本語あいまい検索を行う以外は "general" で良いと思う。

"ci" - 大小文字を区別しない
"bin"以外にはすべて "ci" が付いているので大小文字は区別しない.
大小文字を区別する場合は "cs" が付く。

"520" - 詳細不明
520とはUnicode照合アルゴリズム(Unicode collation algorithm = UCA)のバージョンを意味するようだ。
"520"では絵文字を区別するが、"520"を付けない場合は区別しない、と思われる。

"nopad" - 詳細不明
末尾スペースを区別するか?を表すようだ。
MariaDB(MySQL)では、末尾スペースは区別しないのが既定らしい。
なのでそれらも区別したい場合は "nopad" を使う。
※ OracleではVARCHAR2の列だと末尾スペースは区別しなかったような??
CHAR列だと区別するので、まぁそれに近い考えなのかな?


MariaDB, MySQL

0 件のコメント:

その他の記事