Mysql charset

5,903 views
5,682 views

Published on

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,903
On SlideShare
0
From Embeds
0
Number of Embeds
533
Actions
Shares
0
Downloads
31
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Mysql charset

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

×