Weitere ähnliche Inhalte Ähnlich wie Mysqlの文字コード (20) Mehr von Masahiro Tomita (20) Mysqlの文字コード1. MySQLの
文字コード
とみたまさひろ
2011-04-29
MySQLの文字コード Powered by Rabbit 0.9.2
2. 自己紹介
✓ とみた まさひろ
✓ プログラマー
✓ mailto:tommy@tmtm.org
✓ http://d.hatena.ne.jp/tmtms
✓ http://twitter.com/tmtms
1/36
MySQLの文字コード Powered by Rabbit 0.9.2
3. 自己紹介
✓ 日本Rubyの会
✓ 日本MySQLユーザ会
✓ 長野ソフトウェア技術者グループ
2/36
MySQLの文字コード Powered by Rabbit 0.9.2
4. 自己紹介
こんな本書きました
3/36
MySQLの文字コード Powered by Rabbit 0.9.2
5. 自己紹介
デブサミ2011 で LT やりました
4/36
MySQLの文字コード Powered by Rabbit 0.9.2
6. ベストバリュー賞!!
5/36
MySQLの文字コード Powered by Rabbit 0.9.2
7. NSEG
✓ #1 Rubyの黒魔術
✓ #3 はじめてのRuby拡張ライブラ
リ
✓ #6 Ruby紹介
✓ #11 RSpecとCucumber
✓ #13 システムコール
6/36
MySQLの文字コード Powered by Rabbit 0.9.2
8. MySQLの
文字コー
ド
MySQLの文字コード
7/36
Powered by Rabbit 0.9.2
10. charset
と
collation
MySQLの文字コード
9/36
Powered by Rabbit 0.9.2
11. charset
✓ コードと文字との対応
✓ show charset
✓ utf8mb4 : 4バイトUTF-8
(MySQL5.5から)
✓ utf8 : 3バイトUTF-8
✓ eucjpms, cp932, ...
10/36
MySQLの文字コード Powered by Rabbit 0.9.2
12. collation
✓ 文字の照合規則
✓ show collation
✓ utf8_general_ci, utf8_bin,
utf8_unicode_ci, ...
11/36
MySQLの文字コード Powered by Rabbit 0.9.2
13. utf8_general_ci
✓ charset utf8 のデフォルトの
collation
✓ ASCII/ラテン文字の大文字小文
字を区別しない
✓A = a
12/36
MySQLの文字コード Powered by Rabbit 0.9.2
14. utf8_bin
✓ char(n) binary として宣言した時
の collation
✓ すべての文字を区別する
✓ A != a
13/36
MySQLの文字コード Powered by Rabbit 0.9.2
15. utf8_unicode_ci
✓ Unicode Collation Algorithm
(UCA) による collation
✓ 全角/半角/カタカナ/ひらがな/
濁音を区別しない
✓ A=A
✓ は=ば=ぱ=ハ=バ=パ=ハ
✓ http://tmtm.org/tmp/mysql_unicode_collation.html
14/36
MySQLの文字コード Powered by Rabbit 0.9.2
16. 文字コードが関係するもの
✓ クライアント
✓ 接続
✓ データベース
✓ テーブル
✓ カラム
15/36
MySQLの文字コード Powered by Rabbit 0.9.2
17. サーバー変数
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/ |
+--------------------------+----------------------------------+
16/36
MySQLの文字コード Powered by Rabbit 0.9.2
18. ハマりたくな
かったら
utf8 に統一 17/36
MySQLの文字コード Powered by Rabbit 0.9.2
19. データベース charset
新たに作られるテーブルのデフォルト
charset
create database db1 charset utf8;
show create database db1;
18/36
MySQLの文字コード Powered by Rabbit 0.9.2
20. テーブル charset
テーブル内のカラムのデフォルト
charset
create table t1 (...) charset utf8;
show create table t1;
19/36
MySQLの文字コード Powered by Rabbit 0.9.2
21. カラム charset
カラム毎に charset 指定可能
create table t1 (
s char(10) charset cp932,
u char(10) charset utf8
);
20/36
MySQLの文字コード Powered by Rabbit 0.9.2
22. 接続
クライアントが発行するクエリ/クライア
ントに返す結果セットの charset
set names utf8;
21/36
MySQLの文字コード Powered by Rabbit 0.9.2
23. 自動変換
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 |
+--------+--------+
22/36
MySQLの文字コード Powered by Rabbit 0.9.2
24. 文字化
け
MySQLの文字コード
23/36
Powered by Rabbit 0.9.2
25. 「?」
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 |
+--------+--------+
24/36
MySQLの文字コード Powered by Rabbit 0.9.2
26. 「?」
mysql> set names cp932;
mysql> select * from t1;
+------+------+
| s | u |
+------+------+
| ? | ? |
+------+------+
mysql> select hex(s),hex(u) from t1;
+--------+--------+
| hex(s) | hex(u) |
+--------+--------+
| 3F | E298BA |
+--------+--------+
25/36
MySQLの文字コード Powered by Rabbit 0.9.2
27. 「?」が出たら
とりあえず
HEX() で確か
める
MySQLの文字コード
26/36
Powered by Rabbit 0.9.2
28. 接続の 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/ |
+--------------------------+----------------------------------+
27/36
MySQLの文字コード Powered by Rabbit 0.9.2
29. 注意
✓ これらの変数はセッション変数
✓ 接続毎に異なる値をとりうる
✓ PHPから文字化けしてるのに、
mysql コマンドで確かめても意味
ない!
28/36
MySQLの文字コード Powered by Rabbit 0.9.2
31. インデックスサイズ
create table t (
email char(255) unique
) charset utf8mb4;
ERROR 1071 (42000): Specified key was too long;
max key length is 767 bytes
30/36
MySQLの文字コード Powered by Rabbit 0.9.2
32. 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 '='
31/36
MySQLの文字コード Powered by Rabbit 0.9.2
33. これは大丈夫
set names ascii;
select * from t2 where u='ABC';
同じ ASCII と UTF-8 の比較なのに!?
32/36
MySQLの文字コード Powered by Rabbit 0.9.2
34. 優先順位
✓ 明示的な collate 指定
✓ カラムの collation
✓ リテラルの collation
33/36
MySQLの文字コード Powered by Rabbit 0.9.2
35. 明示的な 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
34/36
MySQLの文字コード Powered by Rabbit 0.9.2
36. ただしカラム
のインデックス
が使われなく
なるので注意
MySQLの文字コード
35/36
Powered by Rabbit 0.9.2
37. まとめ
✓ 文字コード周りはややこしい
✓ 「?」が出たら HEX()
✓ utf8 に揃えると楽チン
36/36
MySQLの文字コード Powered by Rabbit 0.9.2