mysql charset
TRANSCRIPT
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
MySQLの文字コード
OSC2011.DB
とみたまさひろ日本MySQLユーザ会
2011-11-05
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
自己紹介
とみたまさひろ✓
日本MySQLユーザ会✓
長野ソフトウェア技術者グループ(NSEG)✓
mailto:[email protected]✓
id:tmtms✓
@tmtms✓
1/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
MySQLの文字コード
2/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
charset と
collation3/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
charset
コードと文字との対応✓
show charset✓
utf8mb4 : 4バイトUTF-8 (MySQL5.5から)✓
utf8 : 3バイトUTF-8✓
eucjpms, cp932, ...✓
4/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
collation
文字の照合規則✓
show collation✓
utf8_general_ci, utf8_bin, utf8_unicode_ci, ...
✓
5/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
utf8_general_ci
charset utf8 のデフォルトの collation✓
ASCII/ラテン文字の大文字小文字を区別しない
✓
A = a✓
6/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
utf8_bin
char(n) binary として宣言した時の collation✓
すべての文字を区別する✓
A != a✓
7/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
utf8_unicode_ci
Unicode Collation Algorithm (UCA) による collation
✓
全角/半角/カタカナ/ひらがな/濁音を区別しない
✓
A=A✓
は=ば=ぱ=ハ=バ=パ=ハ✓
http://tmtm.org/tmp/mysql_unicode_collation.html
✓
8/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
文字コードが関係するもの
クライアント✓
接続✓
データベース✓
テーブル✓
カラム✓
9/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
サーバー変数
mysql> show variables like 'char%';+--------------------------+----------------------------------+| Variable_name | Value |+--------------------------+----------------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/charsets/ |+--------------------------+----------------------------------+
10/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
ハマりたくなかったら
utf8 に統一11/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
データベース charset
新たに作られるテーブルのデフォルト charset
create database db1 charset utf8;
show create database db1;
12/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
テーブル charset
テーブル内のカラムのデフォルト charset
create table t1 (...) charset utf8;
show create table t1;
13/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
カラム charset
カラム毎に charset 指定可能
create table t1 ( s char(10) charset cp932, u char(10) charset utf8);
14/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
接続
クライアントが発行するクエリ/クライアントに返す結果セットの charset
set names utf8;
15/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
自動変換
mysql> insert into t1 (s,u) values ('あ','あ');mysql> select * from t1;+------+------+| s | u |+------+------+| あ | あ |+------+------+mysql> select hex(s),hex(u) from t1;+--------+--------+| hex(s) | hex(u) |+--------+--------+| 82A0 | E38182 |+--------+--------+
16/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
文字化け
17/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
「?」
mysql> insert into t1 (s,u) values ('☺', '☺');mysql> select * from t1;+------+------+| s | u |+------+------+| ? | ☺ |+------+------+mysql> select hex(s),hex(u) from t1;+--------+--------+| hex(s) | hex(u) |+--------+--------+| 3F | E298BA |+--------+--------+
18/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
「?」
mysql> set names cp932;mysql> select * from t1;+------+------+| s | u |+------+------+| ? | ? |+------+------+mysql> select hex(s),hex(u) from t1;+--------+--------+| hex(s) | hex(u) |+--------+--------+| 3F | E298BA |+--------+--------+
19/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
「?」が出たらとりあえず
HEX() で確かめる
20/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
接続の charset を確かめる
mysql> show variables like 'char%';+--------------------------+----------------------------------+| Variable_name | Value |+--------------------------+----------------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/charsets/ |+--------------------------+----------------------------------+
21/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
注意
これらの変数はセッション変数✓
接続毎に異なる値をとりうる✓
PHPから文字化けしてるのに、mysql コマンドで確かめても意味ない!
✓
22/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
charset を混在させないといけない事情
23/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
インデックスサイズ
create table t ( email char(255) unique) charset utf8mb4;ERROR 1071 (42000): Specified key was too long;max key length is 767 bytes
24/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
Illegal mix of collations
create table t2 ( a char(10) charset ascii, u char(10) charset utf8);select * from t2 where a='あ';ERROR 1267 (HY000): Illegal mix of collations(ascii_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
25/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
これは大丈夫
set names ascii;select * from t2 where u='ABC';
同じ ASCII と UTF-8 の比較なのに!?
26/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
優先順位
明示的な collate 指定✓
カラムの collation✓
リテラルの collation✓
27/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
明示的な collate
select * from t2 where a='あ';ERROR 1267 (HY000): Illegal mix of collations(ascii_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
select * from t2 where a='あ' collate utf8_general_ci;→ OK
28/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
ただしカラムのインデックスが使われなくなるので注意
29/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
まとめ
文字コード周りはややこしい✓
「?」が出たら HEX()✓
utf8 に揃えると楽チン✓
30/30