🔍

【MySQL】照合順序ってなんだろう

2023/11/05に公開

こんにちは。こしです。

この記事では、MySQLの照合順序について解説していきます。

いきさつ

AWSより以下の通達があったため。

Amazon RDS は、MySQL マイナーバージョン 5.7.37、5.7.38、5.7.39、5.7.40、5.7.41、5.7.42 の
標準サポートを 2024 年 1 月 16 日に終了します。
・・・
(省略)
・・・
2024 年 2 月 16 日午前 00:00:01 UTC に、
マイナーバージョン 5.7.37、5.7.38、5.7.39、5.7.40、5.7.41、5.7.42 を実行している 
MySQL データベースが残っている場合は、インスタンスの定期メンテナンス期間に関係なく、
メジャーバージョン 8.0 にアップグレードされます。

つまり、テストをしていないのに、いきなりMySQLがアップデートされちゃうということ。

こちらの問題に対処するため。

照合順序とは

照合順序とは、文字を並び替えや比較するときのルールです。

照合順序については、以下のサイトが参考になりました。ありがとうございます。
https://www.javadrive.jp/mysql/ini/index5.html

windows SQLSerner版ですが、とてもわかりやすいサイト。
https://www.dbsheetclient.jp/blog/?p=1765

実際の文字列比較だとどうなるの?

ここでは、実際の照合順序を用いて解説します。
用いるのは、utf8mb4_0900_cs_asと、utf8mb4_0900_ci_aiです。

文字コード 意味
utf8mb4_0900_cs_as 絵文字や特殊文字を含むUnicode文字セットで
アクセントを区別し、大文字と小文字も区別する
utf8mb4_0900_ci_ai 絵文字や特殊文字を含むUnicode文字セットで
アクセントが区別されず、大文字と小文字も区別しない

検証してみましょう。

以下のようなtestという名のテーブルがあったとします。

id 文字
1 a
2 A

上記のテーブルから、

  • 照合順序がutf8mb4_0900_ci_ai
  • 照合順序がutf8mb4_0900_cs_as

の2パターンで、

select * from test where id = 'a';

を実行し、文字がaであるものをセレクトします。


結果

結果は、以下のようになりました。

照合順序 結果
utf8mb4_0900_ci_ai A
a
utf8mb4_0900_cs_as a

utf8mb4_0900_ci_aiのときは、大文字小文字が区別されずに、Aとaがセレクトされています。
一方、utf8mb4_0900_cs_asは、大文字小文字が区別され、aのみセレクトされています。

まとめ

今回は、MySQLに登場する照合順序を解説しました。
データのソート処理などに関わってくる大事な概念(らしい)ので、触れることができてよかったです。
ここまで目を通していただき、ありがとうございました。

あとがき

初めて技術系の記事を書いてみましたが、楽しくもあり、難しくもありました。
わかりやすい記事を目指して頑張っていきます。あくまでマイペースかもしれません。

ちなみに、なぜ例でutf8mb4系を用いたのかというと、、、
いきさつのMySQLのバージョンアップの変更点がデフォルト照合順序の変更、、、
つまり、utf8mb4_0900_ci_aiになるからでした。
「いきなり例でutfうんたらかんたらを用いるのはどうなんだ・・・?」と思いましたが、
せっかくなので、変更に合わせてutf8mb4系を選びました。

稚拙な文章になってしまいましたが、ここまで読んでくださりありがとうございました。
またお会いしましょう!

Discussion