Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MySQLの                           文字コード                              OSC2011.DB                           とみたまさひろ          ...
自己紹介      ✓ とみたまさひろ      ✓ 日本MySQLユーザ会      ✓ 長野ソフトウェア技術者グループ(NSEG)      ✓ mailto:tommy@mysql.gr.jp      ✓ id:tmtms      ✓...
MySQLの  文字コード                                         2/30MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
charset          と      collationMySQLの文字コード - OSC2011.DB                                         3/30                    ...
charset      ✓ コードと文字との対応      ✓ show charset      ✓ utf8mb4 : 4バイトUTF-8 (MySQL5.5から)      ✓ utf8 : 3バイトUTF-8      ✓ eucjp...
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                                       ...
utf8_unicode_ci      ✓ Unicode Collation Algorithm (UCA) によ        る collation      ✓ 全角/半角/カタカナ/ひらがな/濁音を区別し        ない    ...
文字コードが関係するもの      ✓ クライアント      ✓ 接続      ✓ データベース      ✓ テーブル      ✓ カラム                                         9/30MySQ...
サーバー変数          mysql> show variables like char%;          +--------------------------+----------------------------------+...
ハマりたくな   かったら  utf8 に統一                             11/30MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
データベース charset    新たに作られるテーブルのデフォルト charset               create database db1 charset utf8;               show create data...
テーブル charset    テーブル内のカラムのデフォルト charset             create table t1 (...) charset utf8;             show create table t1; ...
カラム charset    カラム毎に charset 指定可能                     create table t1 (                        s char(10) charset cp932,  ...
接続    クライアントが発行するクエリ/クライアントに返す結    果セットの charset                           set names utf8;                                ...
自動変換         mysql> insert into t1 (s,u) values (あ,あ);         mysql> select * from t1;         +------+------+         | ...
文字化    けMySQLの文字コード - OSC2011.DB                                       17/30                           Powered by Rabbit 1...
「?」           mysql> insert into t1 (s,u) values (☺, ☺);           mysql> select * from t1;           +------+------+     ...
「?」                 mysql> set names cp932;                 mysql> select * from t1;                 +------+------+      ...
「?」が出たら    とりあえず   HEX() で確か      めるMySQLの文字コード - OSC2011.DB                                       20/30                  ...
接続の charset を確かめる          mysql> show variables like char%;          +--------------------------+------------------------...
注意      ✓ これらの変数はセッション変数      ✓ 接続毎に異なる値をとりうる      ✓ PHPから文字化けしてるのに、mysql コマンド        で確かめても意味ない!                         ...
charset を混  在させないと  いけない事情                                       23/30MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
インデックスサイズ         create table t (           email char(255) unique         ) charset utf8mb4;         ERROR 1071 (42000):...
Illegal mix of collations          create table t2 (             a char(10) charset ascii,             u char(10) charset ...
これは大丈夫                 set names ascii;                 select * from t2 where u=ABC;    同じ ASCII と UTF-8 の比較なのに!?        ...
優先順位      ✓ 明示的な collate 指定      ✓ カラムの collation      ✓ リテラルの collation                                              27/3...
明示的な collate          select * from t2 where a=あ;          ERROR 1267 (HY000): Illegal mix of collations          (ascii_g...
ただしカラム   のインデックス   が使われなく   なるので注意MySQLの文字コード - OSC2011.DB                                       29/30                    ...
まとめ      ✓ 文字コード周りはややこしい      ✓ 「?」が出たら HEX()      ✓ utf8 に揃えると楽チン                                             30/30MySQLの...
Upcoming SlideShare
Loading in …5
×

Mysql charset

6,134 views

Published on

Published in: Technology
  • Be the first to comment

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

×