MySQLの考えるマルチバイト文字

MySQLのソース*1を見ていて見つけた「MySQLの考える*2マルチバイト文字」です。
バージョンはMySQL-4.1.18を参考にしています。

EUC-JP

EUC-JP
1バイト目2バイト目3バイト目
0xA1〜0xFE0xA1〜0xFE-
0x8E0xA1〜0xDF-
0x8F0xA1〜0xFE0xA1〜0xFE

表を横に見て、いずれかの行に一致するバイトの列がEUC-JPのマルチバイト文字と判断されます。
ちゃんと3バイトにも対応しているようです。

Shift_JIS

Shift_JIS
1バイト目2バイト目
0x81〜0x9F,
0xE0〜0xFC
0x40〜0x7E,
0x80〜0xFC

Shift_JISは条件の数がEUC-JPに対して少ないのですが、範囲が分断しています。

CP932

CP932
1バイト目2バイト目
0x81〜0x9F,
0xE0〜0xFC
0x40〜0x7E,
0x80〜0xFC

CP932はShift_JISと全く同じです。

GBK(簡体字中国語)

GBK
1バイト目2バイト目
0x81〜0xFE0x40〜0x7E,
0x80〜0xFE

GBKは中国の簡体字で使われる文字エンコーディングで、最近はあまり使われていないそうです。しかし、MySQLエスケープ関数の中にはGBK使用時の問題の為に書かれた処理があるくらいの最凶っぷりを誇る文字エンコーディングですので載せておきます。
Shift_JISと似ていますので、GBKで起きる問題はShift_JISでも起きるかもしれません。


UTF-8は処理が複雑なので省略しますが、1バイト目だけを見て長さを決めているのではなく、全部のバイトを見て判定していました。

0x40〜0x7Eの文字

ついでに、Shift_JISの2バイト目と重複するいわゆるASCII文字の一覧です。色々な事情でちゃんと表示されていない文字があるかもしれません。

かぶる文字
バイト文字
0x40@
0x41〜0x5AA〜Z
0x5B[
0x5C\
0x5D]
0x5E^
0x5F_
0x60`
0x61〜0x7Aa〜z
0x7B{
0x7C|
0x7D}
0x7E~

*1:ctype-???.cにあるismbchar_???関数

*2:マルチバイト文字か否かの判定に使われる条件