Contenu connexe Similaire à Mysql charset Similaire à Mysql charset (20) Plus de Masahiro Tomita (20) Mysql charset1. MySQLの
文字コード
OSC2011.DB
とみたまさひろ
日本MySQLユーザ会
2011-11-05
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
2. 自己紹介
✓ とみたまさひろ
✓ 日本MySQLユーザ会
✓ 長野ソフトウェア技術者グループ(NSEG)
✓ mailto:tommy@mysql.gr.jp
✓ id:tmtms
✓ @tmtms
1/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
3. MySQLの
文字コード
2/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
4. charset
と
collation
MySQLの文字コード - OSC2011.DB
3/30
Powered by Rabbit 1.0.4
5. 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
6. collation
✓ 文字の照合規則
✓ show collation
✓ utf8_general_ci, utf8_bin,
utf8_unicode_ci, ...
5/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
7. utf8_general_ci
✓ charset utf8 のデフォルトの collation
✓ ASCII/ラテン文字の大文字小文字を区別しな
い
✓ A=a
6/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
8. utf8_bin
✓ char(n) binary として宣言した時の collation
✓ すべての文字を区別する
✓ A != a
7/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
9. 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
10. 文字コードが関係するもの
✓ クライアント
✓ 接続
✓ データベース
✓ テーブル
✓ カラム
9/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
11. サーバー変数
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
12. ハマりたくな
かったら
utf8 に統一 11/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
13. データベース charset
新たに作られるテーブルのデフォルト charset
create database db1 charset utf8;
show create database db1;
12/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
14. テーブル charset
テーブル内のカラムのデフォルト charset
create table t1 (...) charset utf8;
show create table t1;
13/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
15. カラム 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
16. 接続
クライアントが発行するクエリ/クライアントに返す結
果セットの charset
set names utf8;
15/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
17. 自動変換
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
18. 文字化
け
MySQLの文字コード - OSC2011.DB
17/30
Powered by Rabbit 1.0.4
19. 「?」
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
20. 「?」
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
21. 「?」が出たら
とりあえず
HEX() で確か
める
MySQLの文字コード - OSC2011.DB
20/30
Powered by Rabbit 1.0.4
22. 接続の 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
23. 注意
✓ これらの変数はセッション変数
✓ 接続毎に異なる値をとりうる
✓ PHPから文字化けしてるのに、mysql コマンド
で確かめても意味ない!
22/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
24. charset を混
在させないと
いけない事情
23/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
25. インデックスサイズ
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
26. 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
27. これは大丈夫
set names ascii;
select * from t2 where u='ABC';
同じ ASCII と UTF-8 の比較なのに!?
26/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
28. 優先順位
✓ 明示的な collate 指定
✓ カラムの collation
✓ リテラルの collation
27/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4
29. 明示的な 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
30. ただしカラム
のインデックス
が使われなく
なるので注意
MySQLの文字コード - OSC2011.DB
29/30
Powered by Rabbit 1.0.4
31. まとめ
✓ 文字コード周りはややこしい
✓ 「?」が出たら HEX()
✓ utf8 に揃えると楽チン
30/30
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4