『MySQLの文字コード事情』を読む
文字コードの知識がなくても読める神資料 kadoyau.icon
Charcter setとEncodingは別物
Charcter set(文字集合)
文字の集合
文字コードと呼ばれることもある
Encoding(文字符号化方式)
文字集合の文字をバイト列に変換する方式
EncodingとCharcter setは対応関係がある
table: Encoding
Encoding Character set
UTF-8 Unicode
EUC-JP US-ASCII, JIS X 0208, ...
文字集合とは別の意味で使われる
「文字集合とエンコーディング方式」をまとめて指す言葉として使われることが多い?
RFC2278から来ている?(歴史的経緯から、文字集合とエンコーディングをあわせて指す) HISTORICAL NOTE: The term "character set" was originally used in MIME to describe such straightforward schemes as US-ASCII and ISO-8859-1 which consist of a small set of characters and a simple one-to-one mapping from single octets to single characters.
Multi-octet character encoding schemes and switching techniques make the situation much more complex.
As such, the definition of this term was revised to emphasize both the conversion aspect of the process, and the term itself has been changed to "charset" to emphasize that it is not, after all, just a set of characters.
A discussion of these issues as well as specification of standard terminology for use in the IETF appears in RFC 2130.
MySQLで利用できるcharset
一覧
code:sql
mysql> SHOW CHARSET;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
...
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
...
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
utf8(utf8mb3)とutf8mb4
MySQLのみにこの区分がある
それ以外では、UTF-8は4バイトなのが普通
utf8mb4でないと、一部の漢字と絵文字とかが使えない
𩸽(Unicode: U+29E3D)や🐱や💯は4バイト
MySQLのCharsetは様々なレイヤーで設定値を持つ
詳しくはスライドを見よう
SHOW VARIABLES LIKE '%char%'で確認できる
サーバ、クライアント、それらの接続
各DB、各テーブル、各カラム
サーバーCharset > DB Charset > テーブル Charset > カラム Charset
上位がデフォルト値になる
フレキシブルに設定できる一方、アドホックに変更するとハマる(確信)ので統一しておきたいkadoyau.icon
クライアントCharset
クライアント内での文字列処理 + サーバとの接続Charset
mysqldコマンドのデフォルトはauto
システムのロケールがLANG=ja_JP.UTF-8のときはutf8mb3 になるので注意
UTF8接続からutf8mb4のDBを利用したときのトラブル
utf8のクライアント側から4バイト文字を参照すると?になる
utf8のクライアント側から4バイト文字を登録すると化ける
INSERTできてしまう
SET sql_mode='STRICT_ALL_TABLES'; しておくとエラーにしてくれる
MySQL 5.7からデフォルトON
CharsetごとにCollationが決まっている