MySQLの              文字コード              とみたまさひろ                2011-04-29MySQLの文字コード         Powered by Rabbit 0.9.2
自己紹介    ✓ とみた まさひろ    ✓ プログラマー    ✓ mailto:tommy@tmtm.org    ✓ http://d.hatena.ne.jp/tmtms    ✓ http://twitter.com/tmtms  ...
自己紹介    ✓ 日本Rubyの会    ✓ 日本MySQLユーザ会    ✓ 長野ソフトウェア技術者グループ                                2/36MySQLの文字コード          Powered b...
自己紹介              こんな本書きました                                     3/36MySQLの文字コード               Powered by Rabbit 0.9.2
自己紹介     デブサミ2011 で LT やりました                                  4/36MySQLの文字コード            Powered by Rabbit 0.9.2
ベストバリュー賞!!                                      5/36MySQLの文字コード                Powered by Rabbit 0.9.2
NSEG    ✓ #1 Rubyの黒魔術    ✓ #3 はじめてのRuby拡張ライブラ      リ    ✓ #6 Ruby紹介    ✓ #11 RSpecとCucumber    ✓ #13 システムコール              ...
MySQLの   文字コー      ドMySQLの文字コード                         7/36              Powered by Rabbit 0.9.2
MySQL  とは(ryMySQLの文字コード                         8/36              Powered by Rabbit 0.9.2
charset         と     collationMySQLの文字コード                         9/36              Powered by Rabbit 0.9.2
charset    ✓ コードと文字との対応    ✓ show charset    ✓ utf8mb4 : 4バイトUTF-8      (MySQL5.5から)    ✓ utf8 : 3バイトUTF-8    ✓ eucjpms, c...
collation    ✓ 文字の照合規則    ✓ show collation    ✓ utf8_general_ci, utf8_bin,      utf8_unicode_ci, ...                      ...
utf8_general_ci    ✓ charset utf8 のデフォルトの      collation    ✓ ASCII/ラテン文字の大文字小文      字を区別しない    ✓A = a                    ...
utf8_bin    ✓ char(n) binary として宣言した時      の collation    ✓ すべての文字を区別する    ✓ A != a                                  13/36...
utf8_unicode_ci    ✓ Unicode Collation Algorithm      (UCA) に従った collation    ✓ 全角/半角/カタカナ/ひらがなを      区別しない    ✓ http://tm...
文字コードが関係するもの    ✓ クライアント    ✓ 接続    ✓ データベース    ✓ テーブル    ✓ カラム                         15/36MySQLの文字コード      Powered by R...
サーバー変数        mysql> show variables like char%;        +--------------------------+----------------------------------+    ...
楽したかっ たら utf8  に統一MySQLの文字コード                      17/36              Powered by Rabbit 0.9.2
データベース charset   新たに作られるテーブルのデフォルト   charset       create database db1 charset utf8;       show create database db1;      ...
テーブル charset   テーブル内のカラムのデフォルト   charset         create table t1 (...) charset utf8;         show create table t1;        ...
カラム charset   カラム毎に charset 指定可能         create table t1 (            s char(10) charset cp932,            u char(10) char...
接続   クライアントが発行するクエリ/クライア   ントに返す結果セットの charset              set names utf8;                                        21/36My...
自動変換       mysql> insert into t1 (s,u) values (あ,あ);       mysql> select * from t1;       +------+------+       | s    | u...
文字化   けMySQLの文字コード                      23/36              Powered by Rabbit 0.9.2
「?」        mysql> insert into t1 (s,u) values (☺, ☺);        mysql> select * from t1;        +------+------+        | s   ...
「?」              mysql> set names cp932;              mysql> select * from t1;              +------+------+              |...
「?」が出たら   とりあえず  HEX() で確か     めるMySQLの文字コード                      26/36              Powered by Rabbit 0.9.2
接続の charset を確かめる        mysql> show variables like char%;        +--------------------------+----------------------------...
注意    ✓ これらの変数はセッション変数    ✓ 接続毎に異なる値をとりうる    ✓ PHPから文字化けしてるのに、      mysql コマンドで確かめても意味      ない!                           ...
charest を混 在させないと いけない事情                      29/36MySQLの文字コード   Powered by Rabbit 0.9.2
インデックスサイズ       create table t (         email char(255) unique       ) charset utf8mb4;       ERROR 1071 (42000): Specifi...
Illegal mix of collations        create table t2 (           a char(10) charset ascii,           u char(10) charset utf8  ...
これは大丈夫        set names ascii;        select * from t2 where u=ABC;   同じ ASCII と UTF-8 の比較なのに!?                           ...
優先順位    ✓ 明示的な collate 指定    ✓ カラムの collation    ✓ リテラルの collation                                33/36MySQLの文字コード        ...
明示的な collate        select * from t2 where a=あ;        ERROR 1267 (HY000): Illegal mix of collations        (ascii_general...
ただしカラム  のインデックス  が使われなく  なるので注意MySQLの文字コード                      35/36              Powered by Rabbit 0.9.2
まとめ    ✓ 文字コード周りはややこしい    ✓ 「?」が出たら HEX()    ✓ utf8 に揃えると楽チン                              36/36MySQLの文字コード           Power...
Upcoming SlideShare
Loading in …5
×

Mysqlの文字コード

7,032 views

Published on

Published in: Lifestyle, Technology

Mysqlの文字コード

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

×