MySQLとMariaDBではUTF-8が「utf8」と「utf8mb4」に分けられてるけど...

f:id:ts0818:20210303221346j:plain

www.jircas.go.jp

2021年2月中旬現在アメリカの中央部は猛烈な寒波に襲われ、テキサスでは慣れない寒さにインフラがパンクし、多くの世帯が停電の中で極寒を耐える事態を迫られているそうです。

237. 寒波と極渦 (polar vortex) | 国立研究開発法人 国際農林水産業研究センター | JIRCAS

米国での報道 などによると、これは極渦の崩れ(polar vortex disruptions)によるものとされています。通常、極渦はジェットストリームによって北極海上空にとどまりますが、ジェットストリームが部分的に折れ曲がり、寒気が低緯度にずり落ちてくる現象だとのことです。

237. 寒波と極渦 (polar vortex) | 国立研究開発法人 国際農林水産業研究センター | JIRCAS

⇧ ということで、「極渦(英語:polar vortex、polar vortices)」が出ちゃいましたな。生物が凍死するほどの寒さの中、停電って事象が起こってることを見るに、エネルギー問題は喫緊の課題と言えますかね。

低体温症(ていたいおんしょう、Hypothermia)とは、恒温動物深部体温(中核体温)が、正常な生体活動の維持に必要な水準を下回ったときに生じる様々な症状の総称。ヒトでは、直腸温が35℃以下に低下した場合に低体温症と診断される。また、低体温症による凍死(とうし)と呼ぶ。

低体温症 - Wikipedia

⇧ ってあるので気になったのが、2021年2月中旬に起きたアメリカの大寒波で、動物の凍死が相次いだってことらしいですが、

academist-cf.com

凍結抑制タンパク質は、氷結晶の成長を抑制して水を不凍状態に保つことができる機能を持つため、生体臓器の移植、食品の冷凍保存、熱エネルギーの蓄積などに活用が期待されています。これらのタンパク質が単に成長抑制だけではなく、成長促進や周期変動を起こす機能も持つことが明らかになり、新たな応用の展開も期待されます。また、生体内で起きるさまざまな結晶成長の原理を理解して、新材料の創製に結びつけることを目指すバイオ・クリスタリゼーションと密接に関連することも大いに期待されます。

流氷の海に住む魚はなぜ凍死しない? – 宇宙実験で解き明かす | academist Journal

⇧ ってことで「凍結抑制タンパク質」なるものの研究が進めば、暖房などとは別の大寒波への対応が可能になるんですかね?

By the way、「MySQL Workbench」を使うから「MySQL」について調べたら、途中で実は「PostgreSQL」を使うってことに気付いて意気消沈としてます、どうもボクです。

無料で使えるから何も言えないけど、「MySQL Workbench」って名前はややこしいな~。

2021年3月4日(木)追記:↓ ここから

「character varying」で検索した時に「PostgreSQL」の情報ばかりヒットしたので、「character varying」が「PostgreSQL」限定の話かと思っていたら、「character varying mysql」で検索したところ、

dev.mysql.com

VARCHAR は CHARACTER VARYING の短縮形です。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.1.3 文字列型の概要

⇧「character varying」ってのは、「PostgreSQL」に限定の話じゃなかったということを知りました情弱な私です。

「VARCHAR」がまさかの短縮形だったとは、知らなんだ...

2021年3月4日(木)追記:↑ ここまで

というわけで、MySQLについて調べてしまったので、備忘録としてメモメモ。

レッツトライ~。 

 

MySQLではUTF-8が「utf8」と「utf8mb4」に分けられてる

あんまり意識してこなかったんですが、

blog.ver001.com

MariaDB(MySQL)以外のデータベースではutf8をutf8とutf8mb4に区別しているのは聞いたことがないので調べてみたのですが、どうもMySQLは歴史的な事情で1文字3バイトまでしか格納できないutf8と4バイトまで格納できるutf8mb4に分かれているとのこと。

MariaDB(MySQL)の照合順序の話

具体的にはJIS X 0213の第3~4水準文字の極一部※1と絵文字😊とか)は1文字4バイト使うのでutf8mb4が必須です。レガシーなシステムは別として今後作るシステムでは文字セットはutf8mb4で良いでしょう。

MariaDB(MySQL)の照合順序の話

⇧ 上記サイト様によりますと、「utf8mb4」ってのは「MySQLMariaDB)」独自の仕様っぽい疑惑が... 

 

照合順序(Collation)って?

RDBMS(Relational DataBase Management System)」を使ったことがある方は、「照合順序(Collation)」という言葉を耳にしたこともいらっしゃるのではないでしょうか?

「照合順序(Collation)」って何?

Collation is the assembly of written information into a standard order. Many systems of collation are based on numerical order or alphabetical order, or extensions and combinations thereof. Collation is a fundamental element of most office filing systemslibrary catalogs, and reference books.

https://en.wikipedia.org/wiki/Collation

⇧ 正確には、「Collation」は「照合」ってことらしいんですが、MySQLのドキュメントだと「collation」が、「照合順序」って訳されているので、「RDBMS(Relational DataBase Management System)」で「照合順序」を「Collation」と捉えることにします。

■英語版

character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set. Let's make the distinction clear with an example of an imaginary character set.

https://dev.mysql.com/doc/refman/5.6/en/charset-general.html

■日本語版

文字セットとは、記号とエンコーディングのセットです。照合順序とは、文字セット内の文字を比較するためのルールを集めたものです。架空の文字セットを例にして、文字セットと照合順序の違いを見てみましょう。

https://dev.mysql.com/doc/refman/5.6/ja/charset-general.html

⇧ 思いっきり「照合順序」って訳されているので。

で、英語版のWikipediaの説明の続きを見ていくと、

In many collation algorithms, the comparison is based not on the numerical codes of the characters, but with reference to the collating sequence – a sequence in which the characters are assumed to come for the purpose of collation – as well as other ordering rules appropriate to the given application. This can serve to apply the correct conventions used for alphabetical ordering in the language in question, dealing properly with differently cased letters, modified lettersdigraphs, particular abbreviations, and so on, as mentioned above under Alphabetical order, and in detail in the Alphabetical order article. 

https://en.wikipedia.org/wiki/Collation

A standard algorithm for collating any collection of strings composed of any standard Unicode symbols is the Unicode Collation Algorithm. This can be adapted to use the appropriate collation sequence for a given language by tailoring its default collation table. Several such tailorings are collected in Common Locale Data Repository.

https://en.wikipedia.org/wiki/Collation

⇧ どうやら、「Collation Argorithm」によって「照合順序」ってものが変わってきそうですと。

で、「Collation Argorithm」の標準としては、「Unicode Collation Algorithm」でしょ、ってことを言っておりますと。

Unicode Collation Algorithm」は、

ISO/IEC 14651:2016Information technology -- International string ordering and comparison -- Method for comparing character strings and description of the common template tailorable ordering, is an ISO Standard specifying an algorithm that can be used when comparing two strings

https://en.wikipedia.org/wiki/ISO/IEC_14651

⇧「ISO/IEC 14651:2016」に関係が深いらしい。

This article needs to be updated. The reason given is: The standard is now known as ISO/IEC 14651:2020 (the sixth edition of the standard) and it no longer appears to be freely available. Please update this article to reflect recent events or newly available information.
Last update: September 2018
 (December 2020)

https://en.wikipedia.org/wiki/ISO/IEC_14651

⇧ ってな感じで、一部の富裕層にしか情報が開示されなくなったとさ...

まぁ、「照合順序」についてのアルゴリズムが、どれぐらい存在するのかは分からんのですが、「Unicode Collation Algorithm」は「ISO(International Organization for Standardization)」や「IEC(International Electrotechnical Commission)」といった団体で定義してるものらしいので、変なものではないのは確かですと。

Unicode Collation Algorithm」って?

Unicode照合アルゴリズムユニコードしょうごうアルゴリズムUnicode collation algorithm、略称: UCA)とは、2つのUnicode文字列を比較するアルゴリズムを定義したものである。これによって言語的に正しい大文字小文字変換、ソートが行える。

Unicode照合アルゴリズム - Wikipedia

⇧ ってことみたいね。

なので、「Unicode」な「文字コード」であれば「Unicode Collation Algorithm」が適応されるでしょうと。

 

で、「MySQL」では、

atsuizo.hatenadiary.jp

200超ありますが、多くは
文字コードセット_照合種別」
で定義されています。

Oracle脳には馴染みの薄い、MySQLの「Collation」にまつわる挙動の話 - なからなLife

文字コードセットは、保存時の文字コードで使われる種類と同じで、40種類ほど。
日本語環境のシステム構築では、sjis,ujis(EUC-JP)やuft8、utf8mb4あたりの文字コードセットがよく見かけられると思います。

Oracle脳には馴染みの薄い、MySQLの「Collation」にまつわる挙動の話 - なからなLife

キモいのは、MySQLはデフォルト任せに環境構築すると、この「大文字小文字区別なし」のモードで出来上がってしまうこと。
このテの話が高じて、「ハハパパ問題」「ビールと寿司が同じ問題」にも発展します。

Oracle脳には馴染みの薄い、MySQLの「Collation」にまつわる挙動の話 - なからなLife

⇧ ってな具合に、「照合順序」が200ぐらいあるらしい。

実際に、MySQL 8.1.3で確認してみた。(事前にコマンドプロンプトで自分のPCにインストールしてるMySQLに接続してる状態です)

mysql> show collation;
+----------------------------+----------+-----+---------+----------+---------+---------------+
| Collation                  | Charset  | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+----------+-----+---------+----------+---------+---------------+
| armscii8_bin               | armscii8 |  64 |         | Yes      |       1 | PAD SPACE     |
| armscii8_general_ci        | armscii8 |  32 | Yes     | Yes      |       1 | PAD SPACE     |
| ascii_bin                  | ascii    |  65 |         | Yes      |       1 | PAD SPACE     |
| ascii_general_ci           | ascii    |  11 | Yes     | Yes      |       1 | PAD SPACE     |
| big5_bin                   | big5     |  84 |         | Yes      |       1 | PAD SPACE     |
| big5_chinese_ci            | big5     |   1 | Yes     | Yes      |       1 | PAD SPACE     |
| binary                     | binary   |  63 | Yes     | Yes      |       1 | NO PAD        |
| cp1250_bin                 | cp1250   |  66 |         | Yes      |       1 | PAD SPACE     |
| cp1250_croatian_ci         | cp1250   |  44 |         | Yes      |       1 | PAD SPACE     |
| cp1250_czech_cs            | cp1250   |  34 |         | Yes      |       2 | PAD SPACE     |
| cp1250_general_ci          | cp1250   |  26 | Yes     | Yes      |       1 | PAD SPACE     |
| cp1250_polish_ci           | cp1250   |  99 |         | Yes      |       1 | PAD SPACE     |
| cp1251_bin                 | cp1251   |  50 |         | Yes      |       1 | PAD SPACE     |
| cp1251_bulgarian_ci        | cp1251   |  14 |         | Yes      |       1 | PAD SPACE     |
| cp1251_general_ci          | cp1251   |  51 | Yes     | Yes      |       1 | PAD SPACE     |
| cp1251_general_cs          | cp1251   |  52 |         | Yes      |       1 | PAD SPACE     |
| cp1251_ukrainian_ci        | cp1251   |  23 |         | Yes      |       1 | PAD SPACE     |
| cp1256_bin                 | cp1256   |  67 |         | Yes      |       1 | PAD SPACE     |
| cp1256_general_ci          | cp1256   |  57 | Yes     | Yes      |       1 | PAD SPACE     |
| cp1257_bin                 | cp1257   |  58 |         | Yes      |       1 | PAD SPACE     |
| cp1257_general_ci          | cp1257   |  59 | Yes     | Yes      |       1 | PAD SPACE     |
| cp1257_lithuanian_ci       | cp1257   |  29 |         | Yes      |       1 | PAD SPACE     |
| cp850_bin                  | cp850    |  80 |         | Yes      |       1 | PAD SPACE     |
| cp850_general_ci           | cp850    |   4 | Yes     | Yes      |       1 | PAD SPACE     |
| cp852_bin                  | cp852    |  81 |         | Yes      |       1 | PAD SPACE     |
| cp852_general_ci           | cp852    |  40 | Yes     | Yes      |       1 | PAD SPACE     |
| cp866_bin                  | cp866    |  68 |         | Yes      |       1 | PAD SPACE     |
| cp866_general_ci           | cp866    |  36 | Yes     | Yes      |       1 | PAD SPACE     |
| cp932_bin                  | cp932    |  96 |         | Yes      |       1 | PAD SPACE     |
| cp932_japanese_ci          | cp932    |  95 | Yes     | Yes      |       1 | PAD SPACE     |
| dec8_bin                   | dec8     |  69 |         | Yes      |       1 | PAD SPACE     |
| dec8_swedish_ci            | dec8     |   3 | Yes     | Yes      |       1 | PAD SPACE     |
| eucjpms_bin                | eucjpms  |  98 |         | Yes      |       1 | PAD SPACE     |
| eucjpms_japanese_ci        | eucjpms  |  97 | Yes     | Yes      |       1 | PAD SPACE     |
| euckr_bin                  | euckr    |  85 |         | Yes      |       1 | PAD SPACE     |
| euckr_korean_ci            | euckr    |  19 | Yes     | Yes      |       1 | PAD SPACE     |
| gb18030_bin                | gb18030  | 249 |         | Yes      |       1 | PAD SPACE     |
| gb18030_chinese_ci         | gb18030  | 248 | Yes     | Yes      |       2 | PAD SPACE     |
| gb18030_unicode_520_ci     | gb18030  | 250 |         | Yes      |       8 | PAD SPACE     |
| gb2312_bin                 | gb2312   |  86 |         | Yes      |       1 | PAD SPACE     |
| gb2312_chinese_ci          | gb2312   |  24 | Yes     | Yes      |       1 | PAD SPACE     |
| gbk_bin                    | gbk      |  87 |         | Yes      |       1 | PAD SPACE     |
| gbk_chinese_ci             | gbk      |  28 | Yes     | Yes      |       1 | PAD SPACE     |
| geostd8_bin                | geostd8  |  93 |         | Yes      |       1 | PAD SPACE     |
| geostd8_general_ci         | geostd8  |  92 | Yes     | Yes      |       1 | PAD SPACE     |
| greek_bin                  | greek    |  70 |         | Yes      |       1 | PAD SPACE     |
| greek_general_ci           | greek    |  25 | Yes     | Yes      |       1 | PAD SPACE     |
| hebrew_bin                 | hebrew   |  71 |         | Yes      |       1 | PAD SPACE     |
| hebrew_general_ci          | hebrew   |  16 | Yes     | Yes      |       1 | PAD SPACE     |
| hp8_bin                    | hp8      |  72 |         | Yes      |       1 | PAD SPACE     |
| hp8_english_ci             | hp8      |   6 | Yes     | Yes      |       1 | PAD SPACE     |
| keybcs2_bin                | keybcs2  |  73 |         | Yes      |       1 | PAD SPACE     |
| keybcs2_general_ci         | keybcs2  |  37 | Yes     | Yes      |       1 | PAD SPACE     |
| koi8r_bin                  | koi8r    |  74 |         | Yes      |       1 | PAD SPACE     |
| koi8r_general_ci           | koi8r    |   7 | Yes     | Yes      |       1 | PAD SPACE     |
| koi8u_bin                  | koi8u    |  75 |         | Yes      |       1 | PAD SPACE     |
| koi8u_general_ci           | koi8u    |  22 | Yes     | Yes      |       1 | PAD SPACE     |
| latin1_bin                 | latin1   |  47 |         | Yes      |       1 | PAD SPACE     |
| latin1_danish_ci           | latin1   |  15 |         | Yes      |       1 | PAD SPACE     |
| latin1_general_ci          | latin1   |  48 |         | Yes      |       1 | PAD SPACE     |
| latin1_general_cs          | latin1   |  49 |         | Yes      |       1 | PAD SPACE     |
| latin1_german1_ci          | latin1   |   5 |         | Yes      |       1 | PAD SPACE     |
| latin1_german2_ci          | latin1   |  31 |         | Yes      |       2 | PAD SPACE     |
| latin1_spanish_ci          | latin1   |  94 |         | Yes      |       1 | PAD SPACE     |
| latin1_swedish_ci          | latin1   |   8 | Yes     | Yes      |       1 | PAD SPACE     |
| latin2_bin                 | latin2   |  77 |         | Yes      |       1 | PAD SPACE     |
| latin2_croatian_ci         | latin2   |  27 |         | Yes      |       1 | PAD SPACE     |
| latin2_czech_cs            | latin2   |   2 |         | Yes      |       4 | PAD SPACE     |
| latin2_general_ci          | latin2   |   9 | Yes     | Yes      |       1 | PAD SPACE     |
| latin2_hungarian_ci        | latin2   |  21 |         | Yes      |       1 | PAD SPACE     |
| latin5_bin                 | latin5   |  78 |         | Yes      |       1 | PAD SPACE     |
| latin5_turkish_ci          | latin5   |  30 | Yes     | Yes      |       1 | PAD SPACE     |
| latin7_bin                 | latin7   |  79 |         | Yes      |       1 | PAD SPACE     |
| latin7_estonian_cs         | latin7   |  20 |         | Yes      |       1 | PAD SPACE     |
| latin7_general_ci          | latin7   |  41 | Yes     | Yes      |       1 | PAD SPACE     |
| latin7_general_cs          | latin7   |  42 |         | Yes      |       1 | PAD SPACE     |
| macce_bin                  | macce    |  43 |         | Yes      |       1 | PAD SPACE     |
| macce_general_ci           | macce    |  38 | Yes     | Yes      |       1 | PAD SPACE     |
| macroman_bin               | macroman |  53 |         | Yes      |       1 | PAD SPACE     |
| macroman_general_ci        | macroman |  39 | Yes     | Yes      |       1 | PAD SPACE     |
| sjis_bin                   | sjis     |  88 |         | Yes      |       1 | PAD SPACE     |
| sjis_japanese_ci           | sjis     |  13 | Yes     | Yes      |       1 | PAD SPACE     |
| swe7_bin                   | swe7     |  82 |         | Yes      |       1 | PAD SPACE     |
| swe7_swedish_ci            | swe7     |  10 | Yes     | Yes      |       1 | PAD SPACE     |
| tis620_bin                 | tis620   |  89 |         | Yes      |       1 | PAD SPACE     |
| tis620_thai_ci             | tis620   |  18 | Yes     | Yes      |       4 | PAD SPACE     |
| ucs2_bin                   | ucs2     |  90 |         | Yes      |       1 | PAD SPACE     |
| ucs2_croatian_ci           | ucs2     | 149 |         | Yes      |       8 | PAD SPACE     |
| ucs2_czech_ci              | ucs2     | 138 |         | Yes      |       8 | PAD SPACE     |
| ucs2_danish_ci             | ucs2     | 139 |         | Yes      |       8 | PAD SPACE     |
| ucs2_esperanto_ci          | ucs2     | 145 |         | Yes      |       8 | PAD SPACE     |
| ucs2_estonian_ci           | ucs2     | 134 |         | Yes      |       8 | PAD SPACE     |
| ucs2_general_ci            | ucs2     |  35 | Yes     | Yes      |       1 | PAD SPACE     |
| ucs2_general_mysql500_ci   | ucs2     | 159 |         | Yes      |       1 | PAD SPACE     |
| ucs2_german2_ci            | ucs2     | 148 |         | Yes      |       8 | PAD SPACE     |
| ucs2_hungarian_ci          | ucs2     | 146 |         | Yes      |       8 | PAD SPACE     |
| ucs2_icelandic_ci          | ucs2     | 129 |         | Yes      |       8 | PAD SPACE     |
| ucs2_latvian_ci            | ucs2     | 130 |         | Yes      |       8 | PAD SPACE     |
| ucs2_lithuanian_ci         | ucs2     | 140 |         | Yes      |       8 | PAD SPACE     |
| ucs2_persian_ci            | ucs2     | 144 |         | Yes      |       8 | PAD SPACE     |
| ucs2_polish_ci             | ucs2     | 133 |         | Yes      |       8 | PAD SPACE     |
| ucs2_romanian_ci           | ucs2     | 131 |         | Yes      |       8 | PAD SPACE     |
| ucs2_roman_ci              | ucs2     | 143 |         | Yes      |       8 | PAD SPACE     |
| ucs2_sinhala_ci            | ucs2     | 147 |         | Yes      |       8 | PAD SPACE     |
| ucs2_slovak_ci             | ucs2     | 141 |         | Yes      |       8 | PAD SPACE     |
| ucs2_slovenian_ci          | ucs2     | 132 |         | Yes      |       8 | PAD SPACE     |
| ucs2_spanish2_ci           | ucs2     | 142 |         | Yes      |       8 | PAD SPACE     |
| ucs2_spanish_ci            | ucs2     | 135 |         | Yes      |       8 | PAD SPACE     |
| ucs2_swedish_ci            | ucs2     | 136 |         | Yes      |       8 | PAD SPACE     |
| ucs2_turkish_ci            | ucs2     | 137 |         | Yes      |       8 | PAD SPACE     |
| ucs2_unicode_520_ci        | ucs2     | 150 |         | Yes      |       8 | PAD SPACE     |
| ucs2_unicode_ci            | ucs2     | 128 |         | Yes      |       8 | PAD SPACE     |
| ucs2_vietnamese_ci         | ucs2     | 151 |         | Yes      |       8 | PAD SPACE     |
| ujis_bin                   | ujis     |  91 |         | Yes      |       1 | PAD SPACE     |
| ujis_japanese_ci           | ujis     |  12 | Yes     | Yes      |       1 | PAD SPACE     |
| utf16le_bin                | utf16le  |  62 |         | Yes      |       1 | PAD SPACE     |
| utf16le_general_ci         | utf16le  |  56 | Yes     | Yes      |       1 | PAD SPACE     |
| utf16_bin                  | utf16    |  55 |         | Yes      |       1 | PAD SPACE     |
| utf16_croatian_ci          | utf16    | 122 |         | Yes      |       8 | PAD SPACE     |
| utf16_czech_ci             | utf16    | 111 |         | Yes      |       8 | PAD SPACE     |
| utf16_danish_ci            | utf16    | 112 |         | Yes      |       8 | PAD SPACE     |
| utf16_esperanto_ci         | utf16    | 118 |         | Yes      |       8 | PAD SPACE     |
| utf16_estonian_ci          | utf16    | 107 |         | Yes      |       8 | PAD SPACE     |
| utf16_general_ci           | utf16    |  54 | Yes     | Yes      |       1 | PAD SPACE     |
| utf16_german2_ci           | utf16    | 121 |         | Yes      |       8 | PAD SPACE     |
| utf16_hungarian_ci         | utf16    | 119 |         | Yes      |       8 | PAD SPACE     |
| utf16_icelandic_ci         | utf16    | 102 |         | Yes      |       8 | PAD SPACE     |
| utf16_latvian_ci           | utf16    | 103 |         | Yes      |       8 | PAD SPACE     |
| utf16_lithuanian_ci        | utf16    | 113 |         | Yes      |       8 | PAD SPACE     |
| utf16_persian_ci           | utf16    | 117 |         | Yes      |       8 | PAD SPACE     |
| utf16_polish_ci            | utf16    | 106 |         | Yes      |       8 | PAD SPACE     |
| utf16_romanian_ci          | utf16    | 104 |         | Yes      |       8 | PAD SPACE     |
| utf16_roman_ci             | utf16    | 116 |         | Yes      |       8 | PAD SPACE     |
| utf16_sinhala_ci           | utf16    | 120 |         | Yes      |       8 | PAD SPACE     |
| utf16_slovak_ci            | utf16    | 114 |         | Yes      |       8 | PAD SPACE     |
| utf16_slovenian_ci         | utf16    | 105 |         | Yes      |       8 | PAD SPACE     |
| utf16_spanish2_ci          | utf16    | 115 |         | Yes      |       8 | PAD SPACE     |
| utf16_spanish_ci           | utf16    | 108 |         | Yes      |       8 | PAD SPACE     |
| utf16_swedish_ci           | utf16    | 109 |         | Yes      |       8 | PAD SPACE     |
| utf16_turkish_ci           | utf16    | 110 |         | Yes      |       8 | PAD SPACE     |
| utf16_unicode_520_ci       | utf16    | 123 |         | Yes      |       8 | PAD SPACE     |
| utf16_unicode_ci           | utf16    | 101 |         | Yes      |       8 | PAD SPACE     |
| utf16_vietnamese_ci        | utf16    | 124 |         | Yes      |       8 | PAD SPACE     |
| utf32_bin                  | utf32    |  61 |         | Yes      |       1 | PAD SPACE     |
| utf32_croatian_ci          | utf32    | 181 |         | Yes      |       8 | PAD SPACE     |
| utf32_czech_ci             | utf32    | 170 |         | Yes      |       8 | PAD SPACE     |
| utf32_danish_ci            | utf32    | 171 |         | Yes      |       8 | PAD SPACE     |
| utf32_esperanto_ci         | utf32    | 177 |         | Yes      |       8 | PAD SPACE     |
| utf32_estonian_ci          | utf32    | 166 |         | Yes      |       8 | PAD SPACE     |
| utf32_general_ci           | utf32    |  60 | Yes     | Yes      |       1 | PAD SPACE     |
| utf32_german2_ci           | utf32    | 180 |         | Yes      |       8 | PAD SPACE     |
| utf32_hungarian_ci         | utf32    | 178 |         | Yes      |       8 | PAD SPACE     |
| utf32_icelandic_ci         | utf32    | 161 |         | Yes      |       8 | PAD SPACE     |
| utf32_latvian_ci           | utf32    | 162 |         | Yes      |       8 | PAD SPACE     |
| utf32_lithuanian_ci        | utf32    | 172 |         | Yes      |       8 | PAD SPACE     |
| utf32_persian_ci           | utf32    | 176 |         | Yes      |       8 | PAD SPACE     |
| utf32_polish_ci            | utf32    | 165 |         | Yes      |       8 | PAD SPACE     |
| utf32_romanian_ci          | utf32    | 163 |         | Yes      |       8 | PAD SPACE     |
| utf32_roman_ci             | utf32    | 175 |         | Yes      |       8 | PAD SPACE     |
| utf32_sinhala_ci           | utf32    | 179 |         | Yes      |       8 | PAD SPACE     |
| utf32_slovak_ci            | utf32    | 173 |         | Yes      |       8 | PAD SPACE     |
| utf32_slovenian_ci         | utf32    | 164 |         | Yes      |       8 | PAD SPACE     |
| utf32_spanish2_ci          | utf32    | 174 |         | Yes      |       8 | PAD SPACE     |
| utf32_spanish_ci           | utf32    | 167 |         | Yes      |       8 | PAD SPACE     |
| utf32_swedish_ci           | utf32    | 168 |         | Yes      |       8 | PAD SPACE     |
| utf32_turkish_ci           | utf32    | 169 |         | Yes      |       8 | PAD SPACE     |
| utf32_unicode_520_ci       | utf32    | 182 |         | Yes      |       8 | PAD SPACE     |
| utf32_unicode_ci           | utf32    | 160 |         | Yes      |       8 | PAD SPACE     |
| utf32_vietnamese_ci        | utf32    | 183 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_0900_ai_ci         | utf8mb4  | 255 | Yes     | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_ci         | utf8mb4  | 305 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_cs         | utf8mb4  | 278 |         | Yes      |       0 | NO PAD        |
| utf8mb4_bin                | utf8mb4  |  46 |         | Yes      |       1 | PAD SPACE     |
| utf8mb4_croatian_ci        | utf8mb4  | 245 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_cs_0900_ai_ci      | utf8mb4  | 266 |         | Yes      |       0 | NO PAD        |
| utf8mb4_cs_0900_as_cs      | utf8mb4  | 289 |         | Yes      |       0 | NO PAD        |
| utf8mb4_czech_ci           | utf8mb4  | 234 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_danish_ci          | utf8mb4  | 235 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_da_0900_ai_ci      | utf8mb4  | 267 |         | Yes      |       0 | NO PAD        |
| utf8mb4_da_0900_as_cs      | utf8mb4  | 290 |         | Yes      |       0 | NO PAD        |
| utf8mb4_de_pb_0900_ai_ci   | utf8mb4  | 256 |         | Yes      |       0 | NO PAD        |
| utf8mb4_de_pb_0900_as_cs   | utf8mb4  | 279 |         | Yes      |       0 | NO PAD        |
| utf8mb4_eo_0900_ai_ci      | utf8mb4  | 273 |         | Yes      |       0 | NO PAD        |
| utf8mb4_eo_0900_as_cs      | utf8mb4  | 296 |         | Yes      |       0 | NO PAD        |
| utf8mb4_esperanto_ci       | utf8mb4  | 241 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_estonian_ci        | utf8mb4  | 230 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_es_0900_ai_ci      | utf8mb4  | 263 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_0900_as_cs      | utf8mb4  | 286 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_trad_0900_ai_ci | utf8mb4  | 270 |         | Yes      |       0 | NO PAD        |
| utf8mb4_es_trad_0900_as_cs | utf8mb4  | 293 |         | Yes      |       0 | NO PAD        |
| utf8mb4_et_0900_ai_ci      | utf8mb4  | 262 |         | Yes      |       0 | NO PAD        |
| utf8mb4_et_0900_as_cs      | utf8mb4  | 285 |         | Yes      |       0 | NO PAD        |
| utf8mb4_general_ci         | utf8mb4  |  45 |         | Yes      |       1 | PAD SPACE     |
| utf8mb4_german2_ci         | utf8mb4  | 244 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_hr_0900_ai_ci      | utf8mb4  | 275 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hr_0900_as_cs      | utf8mb4  | 298 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hungarian_ci       | utf8mb4  | 242 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_hu_0900_ai_ci      | utf8mb4  | 274 |         | Yes      |       0 | NO PAD        |
| utf8mb4_hu_0900_as_cs      | utf8mb4  | 297 |         | Yes      |       0 | NO PAD        |
| utf8mb4_icelandic_ci       | utf8mb4  | 225 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_is_0900_ai_ci      | utf8mb4  | 257 |         | Yes      |       0 | NO PAD        |
| utf8mb4_is_0900_as_cs      | utf8mb4  | 280 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ja_0900_as_cs      | utf8mb4  | 303 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ja_0900_as_cs_ks   | utf8mb4  | 304 |         | Yes      |      24 | NO PAD        |
| utf8mb4_latvian_ci         | utf8mb4  | 226 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_la_0900_ai_ci      | utf8mb4  | 271 |         | Yes      |       0 | NO PAD        |
| utf8mb4_la_0900_as_cs      | utf8mb4  | 294 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lithuanian_ci      | utf8mb4  | 236 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_lt_0900_ai_ci      | utf8mb4  | 268 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lt_0900_as_cs      | utf8mb4  | 291 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lv_0900_ai_ci      | utf8mb4  | 258 |         | Yes      |       0 | NO PAD        |
| utf8mb4_lv_0900_as_cs      | utf8mb4  | 281 |         | Yes      |       0 | NO PAD        |
| utf8mb4_persian_ci         | utf8mb4  | 240 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_pl_0900_ai_ci      | utf8mb4  | 261 |         | Yes      |       0 | NO PAD        |
| utf8mb4_pl_0900_as_cs      | utf8mb4  | 284 |         | Yes      |       0 | NO PAD        |
| utf8mb4_polish_ci          | utf8mb4  | 229 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_romanian_ci        | utf8mb4  | 227 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_roman_ci           | utf8mb4  | 239 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_ro_0900_ai_ci      | utf8mb4  | 259 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ro_0900_as_cs      | utf8mb4  | 282 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ru_0900_ai_ci      | utf8mb4  | 306 |         | Yes      |       0 | NO PAD        |
| utf8mb4_ru_0900_as_cs      | utf8mb4  | 307 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sinhala_ci         | utf8mb4  | 243 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sk_0900_ai_ci      | utf8mb4  | 269 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sk_0900_as_cs      | utf8mb4  | 292 |         | Yes      |       0 | NO PAD        |
| utf8mb4_slovak_ci          | utf8mb4  | 237 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_slovenian_ci       | utf8mb4  | 228 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sl_0900_ai_ci      | utf8mb4  | 260 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sl_0900_as_cs      | utf8mb4  | 283 |         | Yes      |       0 | NO PAD        |
| utf8mb4_spanish2_ci        | utf8mb4  | 238 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_spanish_ci         | utf8mb4  | 231 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_sv_0900_ai_ci      | utf8mb4  | 264 |         | Yes      |       0 | NO PAD        |
| utf8mb4_sv_0900_as_cs      | utf8mb4  | 287 |         | Yes      |       0 | NO PAD        |
| utf8mb4_swedish_ci         | utf8mb4  | 232 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_tr_0900_ai_ci      | utf8mb4  | 265 |         | Yes      |       0 | NO PAD        |
| utf8mb4_tr_0900_as_cs      | utf8mb4  | 288 |         | Yes      |       0 | NO PAD        |
| utf8mb4_turkish_ci         | utf8mb4  | 233 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_unicode_520_ci     | utf8mb4  | 246 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_unicode_ci         | utf8mb4  | 224 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_vietnamese_ci      | utf8mb4  | 247 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_vi_0900_ai_ci      | utf8mb4  | 277 |         | Yes      |       0 | NO PAD        |
| utf8mb4_vi_0900_as_cs      | utf8mb4  | 300 |         | Yes      |       0 | NO PAD        |
| utf8_bin                   | utf8     |  83 |         | Yes      |       1 | PAD SPACE     |
| utf8_croatian_ci           | utf8     | 213 |         | Yes      |       8 | PAD SPACE     |
| utf8_czech_ci              | utf8     | 202 |         | Yes      |       8 | PAD SPACE     |
| utf8_danish_ci             | utf8     | 203 |         | Yes      |       8 | PAD SPACE     |
| utf8_esperanto_ci          | utf8     | 209 |         | Yes      |       8 | PAD SPACE     |
| utf8_estonian_ci           | utf8     | 198 |         | Yes      |       8 | PAD SPACE     |
| utf8_general_ci            | utf8     |  33 | Yes     | Yes      |       1 | PAD SPACE     |
| utf8_general_mysql500_ci   | utf8     | 223 |         | Yes      |       1 | PAD SPACE     |
| utf8_german2_ci            | utf8     | 212 |         | Yes      |       8 | PAD SPACE     |
| utf8_hungarian_ci          | utf8     | 210 |         | Yes      |       8 | PAD SPACE     |
| utf8_icelandic_ci          | utf8     | 193 |         | Yes      |       8 | PAD SPACE     |
| utf8_latvian_ci            | utf8     | 194 |         | Yes      |       8 | PAD SPACE     |
| utf8_lithuanian_ci         | utf8     | 204 |         | Yes      |       8 | PAD SPACE     |
| utf8_persian_ci            | utf8     | 208 |         | Yes      |       8 | PAD SPACE     |
| utf8_polish_ci             | utf8     | 197 |         | Yes      |       8 | PAD SPACE     |
| utf8_romanian_ci           | utf8     | 195 |         | Yes      |       8 | PAD SPACE     |
| utf8_roman_ci              | utf8     | 207 |         | Yes      |       8 | PAD SPACE     |
| utf8_sinhala_ci            | utf8     | 211 |         | Yes      |       8 | PAD SPACE     |
| utf8_slovak_ci             | utf8     | 205 |         | Yes      |       8 | PAD SPACE     |
| utf8_slovenian_ci          | utf8     | 196 |         | Yes      |       8 | PAD SPACE     |
| utf8_spanish2_ci           | utf8     | 206 |         | Yes      |       8 | PAD SPACE     |
| utf8_spanish_ci            | utf8     | 199 |         | Yes      |       8 | PAD SPACE     |
| utf8_swedish_ci            | utf8     | 200 |         | Yes      |       8 | PAD SPACE     |
| utf8_tolower_ci            | utf8     |  76 |         | Yes      |       1 | PAD SPACE     |
| utf8_turkish_ci            | utf8     | 201 |         | Yes      |       8 | PAD SPACE     |
| utf8_unicode_520_ci        | utf8     | 214 |         | Yes      |       8 | PAD SPACE     |
| utf8_unicode_ci            | utf8     | 192 |         | Yes      |       8 | PAD SPACE     |
| utf8_vietnamese_ci         | utf8     | 215 |         | Yes      |       8 | PAD SPACE     |
+----------------------------+----------+-----+---------+----------+---------+---------------+
270 rows in set (0.07 sec)

⇧ 結果は、270となりました。

では、それぞれの「文字コード」に対してどれだけの「照合順序」が用意されてるのか?

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wpdb               |
+--------------------+
5 rows in set (0.01 sec)

mysql> SELECT database();
+--------------------+
| database()         |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT distinct(CHARACTER_SET_NAME), COUNT(CHARACTER_SET_NAME) FROM collations GROUP BY CHARACTER_SET_NAME;
+--------------------+---------------------------+
| CHARACTER_SET_NAME | COUNT(CHARACTER_SET_NAME) |
+--------------------+---------------------------+
| armscii8           |                         2 |
| ascii              |                         2 |
| big5               |                         2 |
| binary             |                         1 |
| cp1250             |                         5 |
| cp1251             |                         5 |
| cp1256             |                         2 |
| cp1257             |                         3 |
| cp850              |                         2 |
| cp852              |                         2 |
| cp866              |                         2 |
| cp932              |                         2 |
| dec8               |                         2 |
| eucjpms            |                         2 |
| euckr              |                         2 |
| gb18030            |                         3 |
| gb2312             |                         2 |
| gbk                |                         2 |
| geostd8            |                         2 |
| greek              |                         2 |
| hebrew             |                         2 |
| hp8                |                         2 |
| keybcs2            |                         2 |
| koi8r              |                         2 |
| koi8u              |                         2 |
| latin1             |                         8 |
| latin2             |                         5 |
| latin5             |                         2 |
| latin7             |                         4 |
| macce              |                         2 |
| macroman           |                         2 |
| sjis               |                         2 |
| swe7               |                         2 |
| tis620             |                         2 |
| ucs2               |                        27 |
| ujis               |                         2 |
| utf16              |                        26 |
| utf16le            |                         2 |
| utf32              |                        26 |
| utf8               |                        28 |
| utf8mb4            |                        73 |
+--------------------+---------------------------+
41 rows in set (0.01 sec)    

⇧ という感じで、MySQL 8.1.3で対応してる「文字コード」は41件ということらしい。「cp932」もあることから「Shift-JIS」とかの「文字コード」も対応してるみたいね。

というか「utf8mb4」に対応してる「照合順序」が73件あるらしい、270件中73件というと、

 73÷270 = 0.2703703703703704

ってことで、MySQL 8.1.3で扱う「照合順序」の中のおよそ27%を占めていますと。

 

改めて「utf8mb4」って何?

「utf8mb4」についてネットでググってみても、MySQLに関する情報しか引っかかってこないところをみると、MySQLMariaDBも含む?)に限定の話っぽい気がする、たぶん。

同じ様な疑問を抱えてる方がいらっしゃいましたが、

ja.stackoverflow.com

マニュアルに書かれている1文字3byteとか4byteというのは固定長文字列型を利用した場合の注意です。可変長エンコーディングを固定長領域に納めようとすると最大サイズを想定する必要があり、たいていの場合無駄が生じます。そのため、可変長文字列を使うように、ということがマニュアルに書かれているわけです。可変長文字列であれば、保存するのにUTF-8エンコードしたバイト表現の長さ(とその長さの情報)しか必要としません。

mysql - utf8mb4は誰がどこで決めた仕様? - スタック・オーバーフロー

⇧ 上記サイト様でも、MySQLのドキュメントに記載があるよ、とは言ってるんですが、微妙に「utf8mb4は誰がどこで決めた仕様?」ってことにはハッキリとした解を示してないっぽい...

まぁ、致し方ないので、一旦、「utf8mb4」ってものがMySQLで決められた仕様という体で話を進めるとして、MySQL 8系のドキュメントを確認してみると、

dev.mysql.com

The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

The utfmb4 character set has these characteristics:

  • Supports BMP and supplementary characters.

  • Requires a maximum of four bytes per multibyte character.

utf8mb4 contrasts with the utf8mb3 character set, which supports only BMP characters and uses a maximum of three bytes per character:

  • For a BMP character, utf8mb4 and utf8mb3 have identical storage characteristics: same code values, same encoding, same length.

  • For a supplementary character, utf8mb4 requires four bytes to store it, whereas utf8mb3 cannot store the character at all. When converting utf8mb3 columns to utf8mb4, you need not worry about converting supplementary characters because there are none.

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html

⇧ というか「utfmb4」と「utf8mb4」は別のものを指してるんだろうか?

まぁ、もう推測するしかないんだが、「utfmb4」ってのは、「UnicodeでMulti-Byteで4Byte」ってことを表してるんじゃないかと。

Unicode」は、

Unicodeでは文字符号化方式としてUTF-8UTF-16UTF-16BEUTF-16LEUTF-32UTF-32BEUTF-32LEの7種類が定められている。

Unicode - Wikipedia

⇧ って感じで「UTF-8」以外もあるから、「utfmb4」ってのは全ての「Unicode」で「Multi-Byte 4Byte」ってことを言ってるんじゃないっすかね?

ちなみに、「Unicode」には「UTF-7」「UTF-9」「UTF-18」「UTF-5」とかもあるみたいね。

なので、「utf8mb4」ってのは、おそらくMySQLを開発してる人たちが勝手に定義したんじゃないのかな?(ちゃんとした仕様があるのかは不明)

結局のところ、よく分からんのだけど、

tmtms.hatenablog.com

UTF-8 は1バイト〜4バイトで1文字が構成される文字コードですが、MySQL の utf8 は4バイト文字を扱うことができません。ハマりたくなければ utf8mb4 を使いましょう。

Unicode - Wikipedia

⇧ 上記サイト様にもありますように、MySQLで「UTF-8」で「4バイト文字」を扱いたいのなら、「utf8mb4」を選択せざるを得ないってことですかね。

 

他の「RDBMS(Relational DataBase Management System)」では「utf8mb4」ってどう処理されるの?

ということで、俄然気になるのが、「MySQLMariaDB)」で「UTF-8」が「utf8」と「utf8mb4」のどっちかで表現してるってことが、他の「RDBMS(Relational DataBase Management System)」でMySQLのデータを扱うときに何か影響しないの?ってことかと。

更に言うならば、「MySQLMariaDB)」使ってたけど、「Oracle Database」に変更します、とかいうケースがあるあるの情報化社会に、我々は生きているわけじゃないですか。

移行とかの際に、何か分からんけど不具合が~ってことは常に起こり得るんだけれども、移行のコストもできるだけ抑えられるなら、「有難さは、いかでしか思ひしられざらん」ということで、調べてみますか。

ちなみに、「RDBMS(Relational DataBase Management System)」の有名どころとしては、

ってあたりがあるのではないでしょうか。(超独断と偏見によります)

ちなみに、MySQLだと、

gihyo.jp

MySQLで設定できる文字コードは,SHOW CHARACTER SET構文で確認することができます。また,SHOW VARIABLES構文から現在設定されている文字コードを確認することができます。

第65回 MySQLと文字コード:MySQL道普請便り|gihyo.jp … 技術評論社

⇧「SHOW VARIABLES構文」で、現在設定されてる「文字ーコード」が確認できるらしいです。

というわけで、確認してみました。 

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | cp932                                         |
| character_set_connection | cp932                                         |
| character_set_database   | utf8                                          |
| character_set_filesystem | binary                                        |
| character_set_results    | cp932                                         |
| character_set_server     | utf8mb4                                       |
| character_set_system     | utf8                                          |
| character_sets_dir       | C:\Program Files\mysql-8.0.13\share\charsets\ |
+--------------------------+-----------------------------------------------+
8 rows in set, 1 warning (0.03 sec)    

⇧ という感じで、あたしの環境は驚くほど統一されていませんでした...

 

pando.life

クライアント側の文字コードがutf8になってしまっているせいで、せっかくデータベースでutf8mb4で作成されているデータが読めない状態になってしまっています。

Mysql Workbenchでutf8mb4のテーブルを扱う際は要注意!!|株式会社クインテット《Pando》

⇧ 上記サイト様で仰られているように、「クライアント側」と「サーバー側」で「文字コード」が異なっている場合、「文字化け」が起こり得るという悲劇が。

※ちなみに、MySQLサーバのバージョンが8以上の場合、MySQL Workbench 8.0.12以降のバージョンだとutf8mb4で接続してくれるようです。

Mysql Workbenchでutf8mb4のテーブルを扱う際は要注意!!|株式会社クインテット《Pando》

⇧ 上記サイト様で仰られているように、「MySQL Workbench」を使う場合は、「MySQL」と「MySQL Workbench」のバージョンに気を付けたいところですね。

話が脱線しましたが、MySQLで「UTF-8」が「utf8」か「utf8mb4」のいずれかで表現されることってのは、MySQL以外の「RDBMS(Relational DataBase Management System)」で影響しないのかと。

 

Oracle Database

docs.oracle.com

MariaDB 

mariadb.com

PostgreSQL

www.postgresql.jp

SQL Server

docs.microsoft.com

 

MySQL以外の「RDBMS(Relational DataBase Management System)」で「UTF-8」を扱う場合の情報を確認した感じでは、結論としては、「UTF-8」で考える場合は、「4Byte」まで扱う方向で考えておけば大丈夫かと。

なので、「MySQL」や「MariaDB 」で「UTF-8」を扱う場合は「utf8mb4」を使っておくのが無難な気がしますかね。

いや~、「文字」関連は複雑ですね...

というか、PostgreSQLを勉強しないといけなかったのに、MySQLのことで1日潰れてしまったではないか...

今回はこのへんで。