SlideShare a Scribd company logo
MySQLの
                           文字コード
                              OSC2011.DB

                           とみたまさひろ
                           日本MySQLユーザ会
                                2011-11-05


MySQLの文字コード - OSC2011.DB          Powered by Rabbit 1.0.4
自己紹介

      ✓ とみたまさひろ
      ✓ 日本MySQLユーザ会
      ✓ 長野ソフトウェア技術者グループ(NSEG)
      ✓ mailto:tommy@mysql.gr.jp
      ✓ id:tmtms
      ✓ @tmtms

                                                 1/30
MySQLの文字コード - OSC2011.DB           Powered by Rabbit 1.0.4
MySQLの
  文字コード
                                         2/30
MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
charset
          と
      collation
MySQLの文字コード - OSC2011.DB
                                         3/30
                           Powered by Rabbit 1.0.4
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
collation


      ✓ 文字の照合規則
      ✓ show collation
      ✓ utf8_general_ci, utf8_bin,
        utf8_unicode_ci, ...



                                                     5/30
MySQLの文字コード - OSC2011.DB               Powered by Rabbit 1.0.4
utf8_general_ci


      ✓ charset utf8 のデフォルトの collation
      ✓ ASCII/ラテン文字の大文字小文字を区別しな
        い
      ✓ A=a



                                                           6/30
MySQLの文字コード - OSC2011.DB                     Powered by Rabbit 1.0.4
utf8_bin


      ✓ char(n) binary として宣言した時の collation
      ✓ すべての文字を区別する
      ✓ A != a




                                                    7/30
MySQLの文字コード - OSC2011.DB              Powered by Rabbit 1.0.4
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
文字コードが関係するもの

      ✓ クライアント
      ✓ 接続
      ✓ データベース
      ✓ テーブル
      ✓ カラム


                                         9/30
MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
サーバー変数

          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
ハマりたくな
   かったら
  utf8 に統一                             11/30
MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
データベース charset


    新たに作られるテーブルのデフォルト charset

               create database db1 charset utf8;
               show create database db1;



                                                          12/30
MySQLの文字コード - OSC2011.DB                      Powered by Rabbit 1.0.4
テーブル charset


    テーブル内のカラムのデフォルト charset

             create table t1 (...) charset utf8;
             show create table t1;



                                                         13/30
MySQLの文字コード - OSC2011.DB                     Powered by Rabbit 1.0.4
カラム 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
接続


    クライアントが発行するクエリ/クライアントに返す結
    果セットの charset

                           set names utf8;




                                                         15/30
MySQLの文字コード - OSC2011.DB                     Powered by Rabbit 1.0.4
自動変換

         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
文字化
    け
MySQLの文字コード - OSC2011.DB
                                       17/30
                           Powered by Rabbit 1.0.4
「?」

           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
「?」
                 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
「?」が出たら
    とりあえず
   HEX() で確か
      める
MySQLの文字コード - OSC2011.DB
                                       20/30
                           Powered by Rabbit 1.0.4
接続の 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
注意


      ✓ これらの変数はセッション変数
      ✓ 接続毎に異なる値をとりうる
      ✓ PHPから文字化けしてるのに、mysql コマンド
        で確かめても意味ない!



                                            22/30
MySQLの文字コード - OSC2011.DB        Powered by Rabbit 1.0.4
charset を混
  在させないと
  いけない事情
                                       23/30
MySQLの文字コード - OSC2011.DB   Powered by Rabbit 1.0.4
インデックスサイズ



         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
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
これは大丈夫



                 set names ascii;
                 select * from t2 where u='ABC';

    同じ ASCII と UTF-8 の比較なのに!?



                                                           26/30
MySQLの文字コード - OSC2011.DB                       Powered by Rabbit 1.0.4
優先順位


      ✓ 明示的な collate 指定
      ✓ カラムの collation
      ✓ リテラルの collation




                                              27/30
MySQLの文字コード - OSC2011.DB          Powered by Rabbit 1.0.4
明示的な 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
ただしカラム
   のインデックス
   が使われなく
   なるので注意
MySQLの文字コード - OSC2011.DB
                                       29/30
                           Powered by Rabbit 1.0.4
まとめ


      ✓ 文字コード周りはややこしい
      ✓ 「?」が出たら HEX()
      ✓ utf8 に揃えると楽チン




                                             30/30
MySQLの文字コード - OSC2011.DB         Powered by Rabbit 1.0.4

More Related Content

PDF
MySQLインストールのお作法
PDF
OSS-DB Goldへの第一歩~実践!運用管理~
PDF
PostgreSQL Unconference #29 Unicode IVS
PDF
C16 45分でわかるPostgreSQLの仕組み by 山田努
PDF
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
PDF
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PDF
20130203 OSS-DB Exam Silver 技術解説無料セミナー
PDF
外部データラッパによる PostgreSQL の拡張
MySQLインストールのお作法
OSS-DB Goldへの第一歩~実践!運用管理~
PostgreSQL Unconference #29 Unicode IVS
C16 45分でわかるPostgreSQLの仕組み by 山田努
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
20130203 OSS-DB Exam Silver 技術解説無料セミナー
外部データラッパによる PostgreSQL の拡張

What's hot (20)

PDF
Hackers Champloo 2016 postgresql-9.6
PDF
MySQL日本語利用徹底入門
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PPTX
大規模CSVをMySQLに入れる
PDF
MySQLの文字コード事情
PDF
MySQL8.0 SYS スキーマ概要
PDF
SQL大量発行処理をいかにして高速化するか
PDF
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PDF
PostgreSQL10徹底解説
PDF
MySQL SYSスキーマのご紹介
PDF
OpenStack + Common Lisp
PDF
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
PDF
Control distribution of virtual machines
PDF
JOSUG Meetup 28th Heat 101
PDF
db tech showcase 2019 D10 Oracle Database New Features
PDF
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PDF
配布用Beginnerならきっと役立つmaster slave環境
PDF
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PDF
KOF2015 PostgreSQL 9.5
PDF
Jpug study-postgre sql-10-pub
Hackers Champloo 2016 postgresql-9.6
MySQL日本語利用徹底入門
ヤフー社内でやってるMySQLチューニングセミナー大公開
大規模CSVをMySQLに入れる
MySQLの文字コード事情
MySQL8.0 SYS スキーマ概要
SQL大量発行処理をいかにして高速化するか
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQL10徹底解説
MySQL SYSスキーマのご紹介
OpenStack + Common Lisp
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Control distribution of virtual machines
JOSUG Meetup 28th Heat 101
db tech showcase 2019 D10 Oracle Database New Features
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
配布用Beginnerならきっと役立つmaster slave環境
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
KOF2015 PostgreSQL 9.5
Jpug study-postgre sql-10-pub
Ad

Similar to Mysql charset (20)

PDF
Mysqlの文字コード
PPTX
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
PDF
Introduction of Oracle Database Architecture
PDF
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
PDF
5 古雷my sql源碼與資料庫規範
PPTX
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
PPT
HandlerSocket plugin for MySQL
PDF
20160929 inno db_fts_jp
PDF
とあるDBAの黒い画面(ターミナル)
PPTX
generate_series関数使い込み
PDF
textsearch_jaで全文検索
PPTX
MySQL SQL tuning
PDF
Mobageの技術を体験(MyDNS編)
PPTX
Impala 2.0 Update 日本語版 #impalajp
PDF
MySQL 5.7 InnoDB 日本語全文検索(その2)
PPTX
OSC ver : MariaDB ColumnStore ベンチマークしちゃいませんか?
PDF
PostgreSQL 12の話
PDF
MySQL 5.7 InnoDB 日本語全文検索
PDF
MySQL 5.7が魅せる新しい運用の形
PPT
Maatkit で MySQL チューニング
Mysqlの文字コード
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
Introduction of Oracle Database Architecture
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
5 古雷my sql源碼與資料庫規範
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
HandlerSocket plugin for MySQL
20160929 inno db_fts_jp
とあるDBAの黒い画面(ターミナル)
generate_series関数使い込み
textsearch_jaで全文検索
MySQL SQL tuning
Mobageの技術を体験(MyDNS編)
Impala 2.0 Update 日本語版 #impalajp
MySQL 5.7 InnoDB 日本語全文検索(その2)
OSC ver : MariaDB ColumnStore ベンチマークしちゃいませんか?
PostgreSQL 12の話
MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7が魅せる新しい運用の形
Maatkit で MySQL チューニング
Ad

More from Masahiro Tomita (20)

PDF
お前の罪を数えろ
PDF
Ruby 2.5
PDF
本当はこわいMySQLプロトコル
PDF
ネットワークこわい
PDF
MySQLの文字コード事情 2017春版
PDF
MySQLの文字コード事情 2017版
PDF
PDF
進捗と品質
PDF
MySQLを拡張する
PDF
「理論から学ぶデータベース実践入門」読書会スペシャル
PDF
MyNAができるまで
PDF
文字化け
PDF
PDF
メールの暗号化
PDF
文字化け
PDF
進捗と品質
PDF
アジャイルジャパン長野サテライト
PDF
🍣=🍺
PDF
本当はこわいエンコーディングの話
お前の罪を数えろ
Ruby 2.5
本当はこわいMySQLプロトコル
ネットワークこわい
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017版
進捗と品質
MySQLを拡張する
「理論から学ぶデータベース実践入門」読書会スペシャル
MyNAができるまで
文字化け
メールの暗号化
文字化け
進捗と品質
アジャイルジャパン長野サテライト
🍣=🍺
本当はこわいエンコーディングの話

Mysql charset

  • 1. 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