Open1

DB (MySQL) の文字コード(charset)と照合順序(collation)について

まさぴょんまさぴょん

文字コード(charset)と照合順序(collation)の確認

MySQLで使用できる文字コード(charset)の確認

MySQLでは複数のCharset(文字セット)を使うことができ、その環境で使用できるCharsetは以下で確認できます。

mysql> show character set;

MySQLで使用できる照合順序(collation)の確認

mysql> show collation;

「データベース」「テーブル」「カラム」単位で文字コードを確認

https://qiita.com/yukiyoshimura/items/d44a98021608c8f8a52a

-- databaseの文字コード確認
show create database [database_name]

-- tableの文字コード確認
show create table [table_name];

文字コードの選定について

https://qiita.com/tfunato/items/e48ad0a37b8244a788f6

  • MySQLの文字コードは、日本語対応を考えると基本的にはutf8mb4一択。
  • charsetは、サーバ、クライアント、サーバー/クライアント感の接続、データベース、、テーブル、カラムで個別に指定でき、
    問題を起こさないようにするには、すべて揃えたほうが無難であります。
character_set_server=utf8mb4
character_set_client=utf8mb4
character_set_connection=utf8mb4
character_set_database=utf8mb4
character_set_results=utf8mb4

照合順序(collation)の選定について

https://qiita.com/tfunato/items/e48ad0a37b8244a788f6

utf8mb4で指定できる照合順序(collation)の選定を考える。

utf8mb4_general_ci
utf8mb4_unicode_ci
utf8mb4_unicode_520_ci
utf8mb4_bin
utf8mb4_ja_0900_as_cs

の5種類がCollationの候補の場合。。。

1. utf8mb4_general_ci

A = a 区別しない
🍣 ≠ 🍺 区別しない
は≠ぱ≠ば 区別する

2. utf8mb4_unicode_ci

A = a 区別しない
🍣 ≠ 🍺 区別しない
は=ぱ=ば 区別しない

3. utf8mb4_unicode_520_ci

A = a 区別しない
🍣 ≠ 🍺 区別する
は=ぱ=ば 区別しない

4. utf8mb4_bin

A ≠ a 区別する
🍣 ≠ 🍺 区別する
は≠ぱ≠ば 区別する

5. utf8mb4_ja_0900_as_cs

A ≠ a 区別する
🍣 ≠ 🍺 区別する
は ≠ ぱ ≠ ば 区別する

比較表

照合順序 Aとaの比較 🍣と🍺の比較 は、ぱ、ばの比較 特徴
utf8mb4_general_ci 区別しない 区別しない 区別する 一般的な用途向け。パフォーマンスが良い。
utf8mb4_unicode_ci 区別しない 区別しない 区別しない Unicode標準に基づく広範な言語対応。
utf8mb4_unicode_520_ci 区別しない 区別する 区別しない 新しいUnicodeバージョンに基づく。
utf8mb4_bin 区別する 区別する 区別する バイナリ比較。大文字小文字やアクセントも区別。
utf8mb4_ja_0900_as_cs 区別する 区別する 区別する 日本語に特化。日本語の正確なソート順序。

日本語データのColumnでの照合順序(collation)選定

  • utf8mb4_bin
    • 日本語ソートがしたいとかこだわりがなければ、日本語の照合順序(collation)もこちらでもいい。
  • utf8mb4_ja_0900_as_cs
    • 日本語でソートしたい場合は、utf8mb4_ja_0900_as_csがおすすめ。
      • MySQL 8.0 で導入された日本語専用の照合順序で、日本語の正しい順序でソートする。

英語データのColumnでの照合順序(collation)選定

  • utf8mb4_bin
    • 文字列をバイト単位で比較、大文字小文字を区別し、より高速なパフォーマンスを提供する。

参考・引用

https://qiita.com/ryouzi/items/c40c32a8772602f2f8d3

https://kazuhira-r.hatenablog.com/entry/2021/05/08/232717

https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0065

https://qiita.com/iwasakik/items/e5e3ce50ad26692269a7