SlideShare a Scribd company logo
1 of 37
Download to read offline
MySQLの
              文字コード
              とみたまさひろ
                2011-04-29

MySQLの文字コード         Powered by Rabbit 0.9.2
自己紹介
    ✓ とみた まさひろ
    ✓ プログラマー
    ✓ mailto:tommy@tmtm.org
    ✓ http://d.hatena.ne.jp/tmtms
    ✓ http://twitter.com/tmtms
                                            1/36
MySQLの文字コード                      Powered by Rabbit 0.9.2
自己紹介


    ✓ 日本Rubyの会
    ✓ 日本MySQLユーザ会
    ✓ 長野ソフトウェア技術者グループ


                                2/36
MySQLの文字コード          Powered by Rabbit 0.9.2
自己紹介




              こんな本書きました

                                     3/36
MySQLの文字コード               Powered by Rabbit 0.9.2
自己紹介



     デブサミ2011 で LT やりました



                                  4/36
MySQLの文字コード            Powered by Rabbit 0.9.2
ベストバリュー賞!!




                                      5/36
MySQLの文字コード                Powered by Rabbit 0.9.2
NSEG
    ✓ #1 Rubyの黒魔術
    ✓ #3 はじめてのRuby拡張ライブラ
      リ
    ✓ #6 Ruby紹介
    ✓ #11 RSpecとCucumber
    ✓ #13 システムコール
                                      6/36
MySQLの文字コード                Powered by Rabbit 0.9.2
MySQLの
   文字コー
      ド
MySQLの文字コード
                         7/36
              Powered by Rabbit 0.9.2
MySQL
  とは(ry
MySQLの文字コード
                         8/36
              Powered by Rabbit 0.9.2
charset
         と
     collation
MySQLの文字コード
                         9/36
              Powered by Rabbit 0.9.2
charset
    ✓ コードと文字との対応
    ✓ show charset
    ✓ utf8mb4 : 4バイトUTF-8
      (MySQL5.5から)
    ✓ utf8 : 3バイトUTF-8
    ✓ eucjpms, cp932, ...
                                    10/36
MySQLの文字コード                 Powered by Rabbit 0.9.2
collation

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

                                           11/36
MySQLの文字コード                        Powered by Rabbit 0.9.2
utf8_general_ci

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

                                        12/36
MySQLの文字コード                     Powered by Rabbit 0.9.2
utf8_bin

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

                                  13/36
MySQLの文字コード               Powered by Rabbit 0.9.2
utf8_unicode_ci
    ✓ Unicode Collation Algorithm
      (UCA) による collation
    ✓ 全角/半角/カタカナ/ひらがな/
      濁音を区別しない
    ✓ A=A
    ✓ は=ば=ぱ=ハ=バ=パ=ハ
    ✓ http://tmtm.org/tmp/mysql_unicode_collation.html
                                                          14/36
MySQLの文字コード                                       Powered by Rabbit 0.9.2
文字コードが関係するもの
    ✓ クライアント
    ✓ 接続
    ✓ データベース
    ✓ テーブル
    ✓ カラム
                         15/36
MySQLの文字コード      Powered by Rabbit 0.9.2
サーバー変数

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

   新たに作られるテーブルのデフォルト
   charset
       create database db1 charset utf8;

       show create database db1;

                                            18/36
MySQLの文字コード                         Powered by Rabbit 0.9.2
テーブル charset

   テーブル内のカラムのデフォルト
   charset
         create table t1 (...) charset utf8;

         show create table t1;


                                                19/36
MySQLの文字コード                             Powered by Rabbit 0.9.2
カラム charset

   カラム毎に charset 指定可能

         create table t1 (
            s char(10) charset cp932,
            u char(10) charset utf8
         );

                                          20/36
MySQLの文字コード                       Powered by Rabbit 0.9.2
接続


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

              set names utf8;


                                        21/36
MySQLの文字コード                     Powered by Rabbit 0.9.2
自動変換
       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/36
MySQLの文字コード                                    Powered by Rabbit 0.9.2
文字化
   け
MySQLの文字コード
                      23/36
              Powered by Rabbit 0.9.2
「?」
        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/36
MySQLの文字コード                                      Powered by Rabbit 0.9.2
「?」
              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/36
MySQLの文字コード                                      Powered by Rabbit 0.9.2
「?」が出たら
   とりあえず
  HEX() で確か
     める
MySQLの文字コード
                      26/36
              Powered by Rabbit 0.9.2
接続の 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/36
MySQLの文字コード                                                     Powered by Rabbit 0.9.2
注意

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

                              28/36
MySQLの文字コード           Powered by Rabbit 0.9.2
charset を混
 在させないと
 いけない事情
                      29/36
MySQLの文字コード   Powered by Rabbit 0.9.2
インデックスサイズ


       create table t (
         email char(255) unique
       ) charset utf8mb4;
       ERROR 1071 (42000): Specified key was too long;
       max key length is 767 bytes




                                                         30/36
MySQLの文字コード                                      Powered by Rabbit 0.9.2
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/36
MySQLの文字コード                                         Powered by Rabbit 0.9.2
これは大丈夫


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

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

                                           32/36
MySQLの文字コード                        Powered by Rabbit 0.9.2
優先順位


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


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


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


                              36/36
MySQLの文字コード           Powered by Rabbit 0.9.2

More Related Content

Viewers also liked

Scott Dodson - The gamification of journalism - motivational design
Scott Dodson - The gamification of journalism - motivational designScott Dodson - The gamification of journalism - motivational design
Scott Dodson - The gamification of journalism - motivational designAlessandro Iacovangelo
 
CloudFlare vs Incapsula vs ModSecurity
CloudFlare vs Incapsula vs ModSecurityCloudFlare vs Incapsula vs ModSecurity
CloudFlare vs Incapsula vs ModSecurityZero Science Lab
 
How To Run a 5 Whys (With Humans, Not Robots)
How To Run a 5 Whys (With Humans, Not Robots)How To Run a 5 Whys (With Humans, Not Robots)
How To Run a 5 Whys (With Humans, Not Robots)Dan Milstein
 

Viewers also liked (7)

Scott Dodson - The gamification of journalism - motivational design
Scott Dodson - The gamification of journalism - motivational designScott Dodson - The gamification of journalism - motivational design
Scott Dodson - The gamification of journalism - motivational design
 
InnoDB Locking Explained with Stick Figures
InnoDB Locking Explained with Stick FiguresInnoDB Locking Explained with Stick Figures
InnoDB Locking Explained with Stick Figures
 
CloudFlare vs Incapsula vs ModSecurity
CloudFlare vs Incapsula vs ModSecurityCloudFlare vs Incapsula vs ModSecurity
CloudFlare vs Incapsula vs ModSecurity
 
SQL Outer Joins for Fun and Profit
SQL Outer Joins for Fun and ProfitSQL Outer Joins for Fun and Profit
SQL Outer Joins for Fun and Profit
 
Social, Digital & Mobile in Europe
Social, Digital & Mobile in EuropeSocial, Digital & Mobile in Europe
Social, Digital & Mobile in Europe
 
How To Run a 5 Whys (With Humans, Not Robots)
How To Run a 5 Whys (With Humans, Not Robots)How To Run a 5 Whys (With Humans, Not Robots)
How To Run a 5 Whys (With Humans, Not Robots)
 
Models for hierarchical data
Models for hierarchical dataModels for hierarchical data
Models for hierarchical data
 

Similar to Mysqlの文字コード

5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範Ivan Tu
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSNoriyoshi Shinoda
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうKAWANO KAZUYUKI
 
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合Ryusuke Kajiyama
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要Shinya Sugiyama
 
MySQL日本語利用徹底入門
MySQL日本語利用徹底入門MySQL日本語利用徹底入門
MySQL日本語利用徹底入門Mikiya Okuno
 
20160929 inno db_fts_jp
20160929 inno db_fts_jp20160929 inno db_fts_jp
20160929 inno db_fts_jpyoyamasaki
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7yoku0825
 
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0Ryusuke Kajiyama
 
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Masayuki Ozawa
 
システムパフォーマンス勉強会#8
システムパフォーマンス勉強会#8システムパフォーマンス勉強会#8
システムパフォーマンス勉強会#8shingo suzuki
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形yoku0825
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)yoyamasaki
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureRyota Watabe
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説Masahiro Tomita
 

Similar to Mysqlの文字コード (20)

Mysql charset
Mysql charsetMysql charset
Mysql charset
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
 
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
 
MySQL日本語利用徹底入門
MySQL日本語利用徹底入門MySQL日本語利用徹底入門
MySQL日本語利用徹底入門
 
20160929 inno db_fts_jp
20160929 inno db_fts_jp20160929 inno db_fts_jp
20160929 inno db_fts_jp
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7今から備えるMySQL最新バージョン5.7
今から備えるMySQL最新バージョン5.7
 
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
[OSC 2017 Tokyo/Fall] OSSコンソーシアム DB部会 MySQL 8.0
 
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
 
システムパフォーマンス勉強会#8
システムパフォーマンス勉強会#8システムパフォーマンス勉強会#8
システムパフォーマンス勉強会#8
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
 
システムコール
システムコールシステムコール
システムコール
 

More from Masahiro Tomita

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろMasahiro Tomita
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャルMasahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトMasahiro Tomita
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話Masahiro Tomita
 

More from Masahiro Tomita (20)

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

Mysqlの文字コード

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