SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
<Insert Picture Here>




MySQL 日本語利用徹底入門

日本オラクル株式会社 MySQL Global Business Unit
テクニカルアナリスト 奥野幹也
2012 年 5 月 29 日
                Copyright© 2012, Oracle. All rights reserved.
2




    以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。ま
    た、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはでき
    ません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確
    約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オ
    ラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊
    社の裁量により決定されます。




    Oracle と Java は、 Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
    文中の社名、商品名等は各社の商標または登録商標である場合があります。




                    Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




文字コードとは




             Copyright© 2012, Oracle. All rights reserved.
文字コードは文字を符号化したもの。
●   ASCII
    ●   7ビットで表現可能なラテン文字を中心とした文字コード
    ●   a ---> 0x61, b ---> 0x62, c ---> 0x63
●   JIS X 208
    ●   Shift_JIS … 日本 ---> 0x93FA967B
    ●   EUC-JP … 日本 ---> 0xC6FCCBDC
    ●   UTF-8 … 日本 ---> 0xE697A5E69CAC




     符号化の方式にはいくつか種類がある


                Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




MySQL と文字コード




            Copyright© 2012, Oracle. All rights reserved.
MySQL の文字コードは結構複雑?


    MySQL の文字コードの実装は
           とても柔軟




   柔軟さが増せば複雑さも増す・・・




    Copyright© 2012, Oracle. All rights reserved.
MySQL で利用可能な日本語対応文字コード

文字コード名    対応文字                                            ストレージサイズ

sjis      JIS X 0208:1997                                 1 〜 2 バイト

cp932     JIS X 0208:1997 + NEC 特殊文字                      1 〜 2 バイト
          ・ IBM 拡張文字
ujis      JIS X 0208:1997                                 1 〜 3 バイト

eucjpms   JIS X 0208:1997 + NEC 特殊文字                      1 〜 3 バイト
          ・ IBM 拡張文字
utf8      JIS X 0208:1997 + NEC 特殊文字                      1 〜 3 バイト
          ・ IBM 拡張文字
utf8mb4   JIS X 0213:2004                                 1 〜 4 バイト




          Copyright© 2012, Oracle. All rights reserved.
照合順序
文字の並び順を定義したもの。
mysql> set names utf8 collate utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> select 'abc' = 'ABC';
+---------------+
| 'abc' = 'ABC' |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

mysql> set names utf8 collate utf8_bin;
Query OK, 0 rows affected (0.00 sec)
                                                          ソートや比較の
mysql> select 'abc' = 'ABC';
                                                           結果に影響
+---------------+
| 'abc' = 'ABC' |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)




                   Copyright© 2012, Oracle. All rights reserved.
MySQL で使用可能な照合順序
mysql> show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation                | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci          | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin                 | big5     | 84 |          | Yes      |       1 |
| dec8_swedish_ci          | dec8     |   3 | Yes     | Yes      |       1 |
| dec8_bin                 | dec8     | 69 |          | Yes      |       1 |

                                         :
                                         :

| eucjpms_japanese_ci      | eucjpms | 97 | Yes       | Yes      |       1 |
| eucjpms_bin              | eucjpms | 98 |           | Yes      |       1 |
+--------------------------+----------+-----+---------+----------+---------+
197 rows in set (0.01 sec)




   照合順序は文字コードにマッチしている必要がある


                    Copyright© 2012, Oracle. All rights reserved.
文字コードはセッションごとに異なるかも。



                                                    UTF-8



              セッション 1                                       クライアント 1




              セッション 2                                       クライアント 2


                                              Shift_JIS
    MySQL サーバー




    Copyright© 2012, Oracle. All rights reserved.
文字コードはテーブルごとに異なるかも。


           Shift_JIS



                                テーブル
                                                       UTF-8




  EUC_JP
                 テーブル                          テーブル


                          MySQL サーバー



       Copyright© 2012, Oracle. All rights reserved.
文字コードはカラムごとに異なるかも。



                                                       UTF-8
                                  カラム 1
   Shift_JIS

                                  カラム 2

                                  カラム 3
                                                        binary

                                 テーブル


                          MySQL サーバー



       Copyright© 2012, Oracle. All rights reserved.
MySQL サーバー内の文字コード変換

           ④ データを                  ② クエリの実行
           蓄える際の                     に利用する                     ① 送信する
           文字コード                     文字コード                    SQL 文に対する
⑤ テーブル名や                                                        文字コード
カラム名に対する
  文字コード


                                    セッション                            クライアント
           テーブル


                MySQL サーバー
                                                       ③ クエリの
                                                      実行結果に対する
   ⑥ ファイル名を                                             文字コード
    解決する際の
     文字コード
                ファイルシステム                         出展:エキスパートのための MySQL
                                                 [運用+管理]トラブルシューティングガイド


              Copyright© 2012, Oracle. All rights reserved.
文字コードを確認する
●   SHOW [GLOBAL] VARIABLES LIKE 'char%';
    (1)character_set_client
    (2)character_set_connection
    (3)character_set_results
    (4)character_set_server/character_set_database
    (5)character_set_system
    (6)character_set_filesystem




               Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




テーブルの文字コード




            Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コード(1)
●   カラムごとに文字コードを指定可能

CREATE TABLE t (
   a VARCHAR(100) CHARACTER SET cp932,
   b VARCHAR(100) CHARACTER SET eucjpms,
   c VARCHAR(100) CHARACTER SET utf8,
       :
);



                    超柔軟
            Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コード (2)
CREATE TABLE t (
  a VARCHAR(100) CHARACTER SET cp932,
  b VARCHAR(100) CHARACTER SET eucjpms,
  c VARCHAR(100),
      :
) CHARACTER SET utf8;




   指定がない場合にはテーブルのデフォルト文字コードに



           Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コード (3)
CREATE TABLE t (
   a VARCHAR(100) CHARACTER SET cp932,
   b VARCHAR(100) CHARACTER SET eucjpms,
   c VARCHAR(100),
       :
);




テーブルの文字コードの指定がない場合には・・・
● データベースの文字コードがテーブルのデフォルト文字コードに

● テーブルのデフォルト文字コードがカラムの文字コードに




            Copyright© 2012, Oracle. All rights reserved.
データベースの文字コード
CREATE DATABASE d1 CHARACTER SET utf8;
CREATE DATABASE d2;




       指定がない場合には character_set_server に

       SET GLOBAL character_set_server = utf8


           Copyright© 2012, Oracle. All rights reserved.
文字コードのデフォルト値

                 characer_set_server



            データベースの文字コード
           ( character_set_database )



         テーブルのデフォルト文字コード


                                                    優先度が
                    カラムの文字コード                       最も高い




    Copyright© 2012, Oracle. All rights reserved.
照合順序の設定方法
CREATE TABLE t (
   a VARCHAR(100) CHARACTER SET utf8
   COLLATE utf8_bin,
       :
);

CREATE DATABASE d CHARACTER SET utf8
  COLLATE utf8_bin;

SET GLOBAL collation_server = utf8_bin;




           Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コードの確認方法 (1)
mysql> show create table CityG
*************************** 1. row ***************************
       Table: City
Create Table: CREATE TABLE `City` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)




               Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コードの確認方法 (2)
mysql> show full fields in CityG
*************************** 1. row ***************************
                                                     中略
*************************** 2. row ***************************
     Field: Name
      Type: char(35)
 Collation: latin1_swedish_ci
      Null: NO
       Key:
   Default:
     Extra:
Privileges: select,insert,update,references
   Comment:
*************************** 3. row ***************************
                              :




              Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コードの確認方法 (3)
mysql> select table_name, column_name, collation_name from
information_schema.columns where collation_name is not null and
table_schema='world';
+-----------------+----------------+-------------------+
| table_name      | column_name    | collation_name    |
+-----------------+----------------+-------------------+
| City            | Name           | latin1_swedish_ci |
| City            | CountryCode    | latin1_swedish_ci |
| City            | District       | latin1_swedish_ci |
| Country         | Code           | latin1_swedish_ci |
| Country         | Name           | latin1_swedish_ci |
| Country         | Continent      | latin1_swedish_ci |
| Country         | Region         | latin1_swedish_ci |
| Country         | LocalName      | latin1_swedish_ci |
| Country         | GovernmentForm | latin1_swedish_ci |
| Country         | HeadOfState    | latin1_swedish_ci |
| Country         | Code2          | latin1_swedish_ci |
| CountryLanguage | CountryCode    | latin1_swedish_ci |
| CountryLanguage | Language       | latin1_swedish_ci |
| CountryLanguage | IsOfficial     | latin1_swedish_ci |
+-----------------+----------------+-------------------+
14 rows in set (0.01 sec)




                  Copyright© 2012, Oracle. All rights reserved.
テーブルの文字コードの確認方法 (4)
mysql> select table_schema, table_name, column_name,
collation_name from information_schema.columns where
collation_name not like 'latin%' and table_schema not
in ('mysql', 'information_schema',
'performance_schema');
Empty set (0.00 sec)




             Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




オプション




            Copyright© 2012, Oracle. All rights reserved.
文字コード関係のオプション
●   character_set_server … データベースの文字コードのデ
    フォルトになる
●   character_set_database … データベースの文字コード。
    テーブルの文字コードのデフォルトになる。 CREATE
    DATABASE 実行時に指定したものと同じ。
●   character_set_connection … クライアントごとに設定可
    能な文字コード。 SQL の評価時に適用される。
●   character_set_client … クライアントから送信される文字
    データの文字コード。
●   character_set_results … クライアントへ送信される結果
    に含まれる文字データの文字コード。
●   character_set_system … テーブル名などの文字コード。
    常に utf8 。
●   character_set_filesystem … ファイルシステムへアクセ
    スする際に用いられる文字コード。



           Copyright© 2012, Oracle. All rights reserved.
照合順序関係のオプション
●   collation_server … データベースの照合順序のデ
    フォルトになる。
●   collation_database … データベースの照合順序。
    テーブルの照合順序のデフォルトになる。 CREATE
    DATABASE 実行時に指定したものと同じ。
●   collation_connection … クライアントごとに設定可
    能な照合順序。 SQL の評価時に適用される。




          Copyright© 2012, Oracle. All rights reserved.
skip_character_set_client_handshake
●   クライアントが指定した文字コードを無視してサー
    バーが指定した文字コードを使用
●   C API や PHP 利用時に便利
    ●   Connector/J では効かないので注意




             Copyright© 2012, Oracle. All rights reserved.
default_character_set
●   古いオプションなのでサーバーでは利用しないよう
    ●   MySQL 5.5 で廃止
●   クライアントでは現在も利用中




             Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




ドライバ




             Copyright© 2012, Oracle. All rights reserved.
C API
mysql = mysql_init(NULL);
if (!mysql_real_connect(mysql, NULL, "user",
                        "password", "db", 3306,
                        NULL, 0))
{
    printf("Cannot connect: %s", mysql_error(mysql));
    goto err;
};
if (mysql_set_character_set(mysql, "utf8"))
    goto err;




             Copyright© 2012, Oracle. All rights reserved.
PHP
●   モジュールごとに指定法が異なる
    ●   MySQL 拡張モジュール( mysql ) … mysql_set_charset() ま
        たは SET NAMES
    ●   MySQL 改良型拡張モジュール( mysqli ) …
        mysqli_set_charset() または mysqli::set_charset() または
        SET NAMES
    ●   PDO … SET NAMES
<?php
$dbh = mysql_connect('hostname:3306', 'user', 'password');
if (!$dbh) {
    die('Failed to connect MySQL Server: ' . mysql_error());
}
if(!mysql_set_charset('utf8', $dbh)) {
    die('Failed to change charset.');
}




                Copyright© 2012, Oracle. All rights reserved.
Perl
●   mysql_enable_utf8 属性を指定して、 UTF-8 フラグ
    が有効な文字列を使う。
●   mysql_enable_utf8 属性を指定せず、 MySQL
    Server から受け取った文字列を decode() 、 MySQL
    Server へ渡す文字列を encode() する。


my $dbh = DBI->connect(
    "DBI:mysql:database=db_name;host=hostname",
    "user", "password",
    { RaiseError => 1, mysql_enable_utf8=>1 });




           Copyright© 2012, Oracle. All rights reserved.
Java ( Connector/J )
●   文字コードは characterEncoding プロパティで指定
    ●   指定がない場合には接続先の character_set_server により決
        定。接続後 SET NAMES をドライバが実行。
    ●   --skip-character-set-client-handshake は効かない
●   characterEncoding が何であれ Java の文字列は
    ucs2 に変換される。
Class.forName("com.mysql.jdbc.Driver");
Properties props = new Properties();
props.setProperty("user", "mikiya");
props.setProperty("password", "mikiya's password");
props.setProperty("characterEncoding", "UTF-8");
conn = DriverManager.getConnection(url, props);




               Copyright© 2012, Oracle. All rights reserved.
Ruby
#!/usr/bin/ruby -Ks
  :
my = Mysql.init()
my.options(Mysql::SET_CHARSET_NAME, 'cp932')
my.real_connect('127.0.0.1', 'user',
'password', 'db')
res = my.query('SELECT some_str_col FROM
some_tbl WHERE...');
res.each do |row|
  puts row[0] # シフト JIS ( Cp932 )で出力されま
す。
  :
end



          Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




文字コード関係の
トラブル




             Copyright© 2012, Oracle. All rights reserved.
文字化けの原因と対策
●   実際のデータと文字コードが一致していないと化け
    る。
    ●   接続用の文字コードは問題ないか?
        – アプリケーションが期待している文字コードとドライバの文
          字コードは同じか?
    ●   端末の文字コードは問題ないか?
    ●   テーブル内のデータは問題ないか?




            Copyright© 2012, Oracle. All rights reserved.
LOAD DATA INFILE/SELECT … INTO OUTFILE
●   LOAD DATA INFILE
    ●   ファイルの文字コードが character_set_database になってい
        ることを期待している
    ●   SET character_set_database = charset_name
    ●   テーブルの文字コードと同じ場合には binary を指定する
    ●   mysqlimport を使う
●   SELECT … INTO OUTFILE
    ●   デフォルトでは文字コード変換しない
         –   LOAD DATA で読むときは binary を指定すると良い
    ●   SELECT … INTO OUTOFILE 'file_name' CHARACTER SET
        charset_name ...




               Copyright© 2012, Oracle. All rights reserved.
latin1 で格納されている?
●   セッションの文字コードもテーブルの文字コードも
    latin1 の場合、文字コードの変換が起きないので、
    文字化けも起きない。
●   照合順序が狂ってしまう (latin1_swedish_ci を用い
    て 1 バイトずつ比較されてしまう )
●   本来の文字コードを指定して接続すると , 文字化け
    してしまう




          Copyright© 2012, Oracle. All rights reserved.
latin1 で格納されている?(つづき)
mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> create table t (a char(30) character set latin1);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t values(' これはテストです。 ');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+-----------------------------+
| a                           |
+-----------------------------+
| これはテストです。                    |
+-----------------------------+
1 row in set (0.00 sec)


              Copyright© 2012, Oracle. All rights reserved.
5C 問題
Shift_JIS の2バイト目が 0x5C (¥)であることに起
因する問題。リテラルとして解釈すると 0x5C がエス
ケープ文字として扱われてしまう。

mysql> set names sjis;                    mysql> set names latin1;
Query OK, 0 rows                          Query OK, 0 rows
affected (0.00 sec)                       affected (0.00 sec)

mysql> select ' 表 abc';                   mysql> select ' 表 abc';
+-------+                                 +------+
| 表 abc |                                 | 病 bc |
+-------+                                 +------+
| 表 abc |                                 | 病 bc |
+-------+                                 +------+
1 row in set (0.00 sec)                   1 row in set (0.00 sec)


            Copyright© 2012, Oracle. All rights reserved.
ラウンドトリップ変換
mysql> create table t (a char(1) character set eucjpms);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t values(unhex('8FA2B7'));
Query OK, 1 row affected (0.01 sec)
mysql> select hex(a) from t;
+--------+
| hex(a) |
+--------+
| 8FA2B7 |
+--------+
1 row in set (0.00 sec)
mysql> select hex(convert(convert(a using cp932) using eucjpms)) from t;
+----------------------------------------------------+
| hex(convert(convert(a using cp932) using eucjpms)) |
+----------------------------------------------------+
| A1C1                                               |
+----------------------------------------------------+
1 row in set (0.00 sec)




                 Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




まとめ




            Copyright© 2012, Oracle. All rights reserved.
まとめ
●   MySQL で利用可能な日本語対応文字コードの種類
●   MySQL はカラムごと、セッションごとに文字コー
    ドを指定可能
    ●   文字コードが異なる場合には自動変換
    ●   自動変換が起きないようにするのが理想
    ●   使用するプログラミング言語にあわせて、正しく文字コードを指
        定する
    ●   迷ったらすべて utf8 で統一する
●   SHOW コマンドや INFORMATION_SCHEMA で使
    用中の文字コードを確認




             Copyright© 2012, Oracle. All rights reserved.
46

     宣伝
     ●
         好評につき「エキスパートのための MySQL [運
         用+管理]トラブルシューティングガイド」 近日増
         刷予定 !!
         ●   様々な角度から MySQL のトラブルを解析するのに役立つ書籍
             です。ぜひ安心な DBA 生活のお供に一冊どうぞ。
     ●   Contents
         ●   第 1 章 MySQL の概要
         ●   第 2 章 開発時における問題
         ●   第 3 章 MySQL の状態を見る
         ●   第 4 章 DTrace
         ●   第 5 章 運用中に起きる諸問題
         ●   第 6 章 堅牢な運用を実現するために
         ●   第 7 章 ソースコードのビルド


                    Copyright© 2012, Oracle. All rights reserved.
<Insert Picture Here>




            Copyright© 2012, Oracle. All rights reserved.
Copyright© 2012, Oracle. All rights reserved.
49




     Copyright© 2012, Oracle. All rights reserved.

Contenu connexe

Tendances

MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
Masahiro Tomita
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
Yoshifumi Kawai
 

Tendances (20)

IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
Rest ful api設計入門
Rest ful api設計入門Rest ful api設計入門
Rest ful api設計入門
 
NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
AWS Black Belt Tech シリーズ 2015 - Amazon RedshiftAWS Black Belt Tech シリーズ 2015 - Amazon Redshift
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
手作業なしの安定環境実現に向けたZabbix活用方法紹介+Zabbix2.4最新機能紹介
手作業なしの安定環境実現に向けたZabbix活用方法紹介+Zabbix2.4最新機能紹介手作業なしの安定環境実現に向けたZabbix活用方法紹介+Zabbix2.4最新機能紹介
手作業なしの安定環境実現に向けたZabbix活用方法紹介+Zabbix2.4最新機能紹介
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

En vedette

配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
yut148atgmaildotcom
 
私がMySQLを始めた理由
私がMySQLを始めた理由私がMySQLを始めた理由
私がMySQLを始めた理由
yoyamasaki
 
初心者向けMySQLの始め方
初心者向けMySQLの始め方初心者向けMySQLの始め方
初心者向けMySQLの始め方
Masahiro Tomita
 
Database qpstudy-okuno
Database qpstudy-okunoDatabase qpstudy-okuno
Database qpstudy-okuno
Mikiya Okuno
 
Enter the-dolphine
Enter the-dolphineEnter the-dolphine
Enter the-dolphine
Mikiya Okuno
 
Rdbms qpstudy-okuno
Rdbms qpstudy-okunoRdbms qpstudy-okuno
Rdbms qpstudy-okuno
Mikiya Okuno
 
MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012
Mikiya Okuno
 

En vedette (20)

配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 
MySQLインストールのお作法
MySQLインストールのお作法MySQLインストールのお作法
MySQLインストールのお作法
 
MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したこと
 
私がMySQLを始めた理由
私がMySQLを始めた理由私がMySQLを始めた理由
私がMySQLを始めた理由
 
初心者向けMySQLの始め方
初心者向けMySQLの始め方初心者向けMySQLの始め方
初心者向けMySQLの始め方
 
Mysql toranomaki
Mysql toranomakiMysql toranomaki
Mysql toranomaki
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計リレーショナルな正しいデータベース設計
リレーショナルな正しいデータベース設計
 
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったか私は如何にして詳解 MySQL 5.7を執筆するに至ったか
私は如何にして詳解 MySQL 5.7を執筆するに至ったか
 
Apache Module
Apache ModuleApache Module
Apache Module
 
Database qpstudy-okuno
Database qpstudy-okunoDatabase qpstudy-okuno
Database qpstudy-okuno
 
Enter the-dolphine
Enter the-dolphineEnter the-dolphine
Enter the-dolphine
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
 
Performance Schema @ MySQL Casual #2
Performance Schema @ MySQL Casual #2Performance Schema @ MySQL Casual #2
Performance Schema @ MySQL Casual #2
 
DTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめDTraceによるMySQL解析ことはじめ
DTraceによるMySQL解析ことはじめ
 
Rdbms qpstudy-okuno
Rdbms qpstudy-okunoRdbms qpstudy-okuno
Rdbms qpstudy-okuno
 
Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点
 
Art of MySQL Replication.
Art of MySQL Replication.Art of MySQL Replication.
Art of MySQL Replication.
 
MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012MySQL 5.6新機能解説@dbtechshowcase2012
MySQL 5.6新機能解説@dbtechshowcase2012
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門
 

Similaire à MySQL日本語利用徹底入門

Similaire à MySQL日本語利用徹底入門 (20)

Mysql charset
Mysql charsetMysql charset
Mysql charset
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
 
ついにリリース!! MySQL 8.0 最新情報
ついにリリース!! MySQL 8.0 最新情報ついにリリース!! MySQL 8.0 最新情報
ついにリリース!! 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の日本語キャラクタ・セットと文字照合
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
 
[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
 
MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索
 
Qlik Replicateでのタスクの定義と管理
Qlik Replicateでのタスクの定義と管理Qlik Replicateでのタスクの定義と管理
Qlik Replicateでのタスクの定義と管理
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
Introduction of Oracle Database Architecture
Introduction of Oracle Database ArchitectureIntroduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
How to use STARC RTL Design Style Guide Verilog-HDL 2011 version
How to use STARC RTL Design Style Guide Verilog-HDL 2011 versionHow to use STARC RTL Design Style Guide Verilog-HDL 2011 version
How to use STARC RTL Design Style Guide Verilog-HDL 2011 version
 
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
 
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQLMySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
MySQLのNoSQL機能 - MySQL JSON & HTTP Plugin for MySQL
 
Mysqlの文字コード
Mysqlの文字コードMysqlの文字コード
Mysqlの文字コード
 
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについてCentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
 
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
MySQL最新情報 ※2015年9月5日「第1回 関西DB勉強会」での発表資料
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
Babelfish Compatibility
Babelfish CompatibilityBabelfish Compatibility
Babelfish Compatibility
 

Plus de Mikiya Okuno

Plus de Mikiya Okuno (20)

MySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyondMySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyond
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編
 
リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方リレーショナルデータベースとの上手な付き合い方
リレーショナルデータベースとの上手な付き合い方
 
リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version リレーショナルデータベースとの上手な付き合い方 long version
リレーショナルデータベースとの上手な付き合い方 long version
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 Security
 
What's New in MySQL 5.7 Replication
What's New in MySQL 5.7 ReplicationWhat's New in MySQL 5.7 Replication
What's New in MySQL 5.7 Replication
 
とあるギークのキーボード遍歴
とあるギークのキーボード遍歴とあるギークのキーボード遍歴
とあるギークのキーボード遍歴
 
MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座MySQLアーキテクチャ図解講座
MySQLアーキテクチャ図解講座
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDBWhat's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
なぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのかなぜ、いまリレーショナルモデルなのか
なぜ、いまリレーショナルモデルなのか
 
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
データモデルについて知っておくべき7つのこと 〜NoSQLに手を出す前に〜
 
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
MySQL Cluster 7.4で楽しむスケールアウト @DB Tech Showcase 2015/06
 
人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきか人類は如何にして大切な データベースを守るべきか
人類は如何にして大切な データベースを守るべきか
 
RDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考えるRDBにおけるバリデーションをリレーショナルモデルから考える
RDBにおけるバリデーションをリレーショナルモデルから考える
 
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09
 
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会MySQl 5.6新機能解説@第一回 中国地方DB勉強会
MySQl 5.6新機能解説@第一回 中国地方DB勉強会
 

Dernier

Dernier (12)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

MySQL日本語利用徹底入門

  • 1. <Insert Picture Here> MySQL 日本語利用徹底入門 日本オラクル株式会社 MySQL Global Business Unit テクニカルアナリスト 奥野幹也 2012 年 5 月 29 日 Copyright© 2012, Oracle. All rights reserved.
  • 2. 2 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。ま た、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはでき ません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確 約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オ ラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊 社の裁量により決定されます。 Oracle と Java は、 Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。 文中の社名、商品名等は各社の商標または登録商標である場合があります。 Copyright© 2012, Oracle. All rights reserved.
  • 3. <Insert Picture Here> 文字コードとは Copyright© 2012, Oracle. All rights reserved.
  • 4. 文字コードは文字を符号化したもの。 ● ASCII ● 7ビットで表現可能なラテン文字を中心とした文字コード ● a ---> 0x61, b ---> 0x62, c ---> 0x63 ● JIS X 208 ● Shift_JIS … 日本 ---> 0x93FA967B ● EUC-JP … 日本 ---> 0xC6FCCBDC ● UTF-8 … 日本 ---> 0xE697A5E69CAC 符号化の方式にはいくつか種類がある Copyright© 2012, Oracle. All rights reserved.
  • 5. <Insert Picture Here> MySQL と文字コード Copyright© 2012, Oracle. All rights reserved.
  • 6. MySQL の文字コードは結構複雑? MySQL の文字コードの実装は とても柔軟 柔軟さが増せば複雑さも増す・・・ Copyright© 2012, Oracle. All rights reserved.
  • 7. MySQL で利用可能な日本語対応文字コード 文字コード名 対応文字 ストレージサイズ sjis JIS X 0208:1997 1 〜 2 バイト cp932 JIS X 0208:1997 + NEC 特殊文字 1 〜 2 バイト ・ IBM 拡張文字 ujis JIS X 0208:1997 1 〜 3 バイト eucjpms JIS X 0208:1997 + NEC 特殊文字 1 〜 3 バイト ・ IBM 拡張文字 utf8 JIS X 0208:1997 + NEC 特殊文字 1 〜 3 バイト ・ IBM 拡張文字 utf8mb4 JIS X 0213:2004 1 〜 4 バイト Copyright© 2012, Oracle. All rights reserved.
  • 8. 照合順序 文字の並び順を定義したもの。 mysql> set names utf8 collate utf8_general_ci; Query OK, 0 rows affected (0.00 sec) mysql> select 'abc' = 'ABC'; +---------------+ | 'abc' = 'ABC' | +---------------+ | 1 | +---------------+ 1 row in set (0.00 sec) mysql> set names utf8 collate utf8_bin; Query OK, 0 rows affected (0.00 sec) ソートや比較の mysql> select 'abc' = 'ABC'; 結果に影響 +---------------+ | 'abc' = 'ABC' | +---------------+ | 0 | +---------------+ 1 row in set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 9. MySQL で使用可能な照合順序 mysql> show collation; +--------------------------+----------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+----------+-----+---------+----------+---------+ | big5_chinese_ci | big5 | 1 | Yes | Yes | 1 | | big5_bin | big5 | 84 | | Yes | 1 | | dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 | | dec8_bin | dec8 | 69 | | Yes | 1 | : : | eucjpms_japanese_ci | eucjpms | 97 | Yes | Yes | 1 | | eucjpms_bin | eucjpms | 98 | | Yes | 1 | +--------------------------+----------+-----+---------+----------+---------+ 197 rows in set (0.01 sec) 照合順序は文字コードにマッチしている必要がある Copyright© 2012, Oracle. All rights reserved.
  • 10. 文字コードはセッションごとに異なるかも。 UTF-8 セッション 1 クライアント 1 セッション 2 クライアント 2 Shift_JIS MySQL サーバー Copyright© 2012, Oracle. All rights reserved.
  • 11. 文字コードはテーブルごとに異なるかも。 Shift_JIS テーブル UTF-8 EUC_JP テーブル テーブル MySQL サーバー Copyright© 2012, Oracle. All rights reserved.
  • 12. 文字コードはカラムごとに異なるかも。 UTF-8 カラム 1 Shift_JIS カラム 2 カラム 3 binary テーブル MySQL サーバー Copyright© 2012, Oracle. All rights reserved.
  • 13. MySQL サーバー内の文字コード変換 ④ データを ② クエリの実行 蓄える際の に利用する ① 送信する 文字コード 文字コード SQL 文に対する ⑤ テーブル名や 文字コード カラム名に対する 文字コード セッション クライアント テーブル MySQL サーバー ③ クエリの 実行結果に対する ⑥ ファイル名を 文字コード 解決する際の 文字コード ファイルシステム 出展:エキスパートのための MySQL [運用+管理]トラブルシューティングガイド Copyright© 2012, Oracle. All rights reserved.
  • 14. 文字コードを確認する ● SHOW [GLOBAL] VARIABLES LIKE 'char%'; (1)character_set_client (2)character_set_connection (3)character_set_results (4)character_set_server/character_set_database (5)character_set_system (6)character_set_filesystem Copyright© 2012, Oracle. All rights reserved.
  • 15. <Insert Picture Here> テーブルの文字コード Copyright© 2012, Oracle. All rights reserved.
  • 16. テーブルの文字コード(1) ● カラムごとに文字コードを指定可能 CREATE TABLE t ( a VARCHAR(100) CHARACTER SET cp932, b VARCHAR(100) CHARACTER SET eucjpms, c VARCHAR(100) CHARACTER SET utf8, : ); 超柔軟 Copyright© 2012, Oracle. All rights reserved.
  • 17. テーブルの文字コード (2) CREATE TABLE t ( a VARCHAR(100) CHARACTER SET cp932, b VARCHAR(100) CHARACTER SET eucjpms, c VARCHAR(100), : ) CHARACTER SET utf8; 指定がない場合にはテーブルのデフォルト文字コードに Copyright© 2012, Oracle. All rights reserved.
  • 18. テーブルの文字コード (3) CREATE TABLE t ( a VARCHAR(100) CHARACTER SET cp932, b VARCHAR(100) CHARACTER SET eucjpms, c VARCHAR(100), : ); テーブルの文字コードの指定がない場合には・・・ ● データベースの文字コードがテーブルのデフォルト文字コードに ● テーブルのデフォルト文字コードがカラムの文字コードに Copyright© 2012, Oracle. All rights reserved.
  • 19. データベースの文字コード CREATE DATABASE d1 CHARACTER SET utf8; CREATE DATABASE d2; 指定がない場合には character_set_server に SET GLOBAL character_set_server = utf8 Copyright© 2012, Oracle. All rights reserved.
  • 20. 文字コードのデフォルト値 characer_set_server データベースの文字コード ( character_set_database ) テーブルのデフォルト文字コード 優先度が カラムの文字コード 最も高い Copyright© 2012, Oracle. All rights reserved.
  • 21. 照合順序の設定方法 CREATE TABLE t ( a VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_bin, : ); CREATE DATABASE d CHARACTER SET utf8 COLLATE utf8_bin; SET GLOBAL collation_server = utf8_bin; Copyright© 2012, Oracle. All rights reserved.
  • 22. テーブルの文字コードの確認方法 (1) mysql> show create table CityG *************************** 1. row *************************** Table: City Create Table: CREATE TABLE `City` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1 1 row in set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 23. テーブルの文字コードの確認方法 (2) mysql> show full fields in CityG *************************** 1. row *************************** 中略 *************************** 2. row *************************** Field: Name Type: char(35) Collation: latin1_swedish_ci Null: NO Key: Default: Extra: Privileges: select,insert,update,references Comment: *************************** 3. row *************************** : Copyright© 2012, Oracle. All rights reserved.
  • 24. テーブルの文字コードの確認方法 (3) mysql> select table_name, column_name, collation_name from information_schema.columns where collation_name is not null and table_schema='world'; +-----------------+----------------+-------------------+ | table_name | column_name | collation_name | +-----------------+----------------+-------------------+ | City | Name | latin1_swedish_ci | | City | CountryCode | latin1_swedish_ci | | City | District | latin1_swedish_ci | | Country | Code | latin1_swedish_ci | | Country | Name | latin1_swedish_ci | | Country | Continent | latin1_swedish_ci | | Country | Region | latin1_swedish_ci | | Country | LocalName | latin1_swedish_ci | | Country | GovernmentForm | latin1_swedish_ci | | Country | HeadOfState | latin1_swedish_ci | | Country | Code2 | latin1_swedish_ci | | CountryLanguage | CountryCode | latin1_swedish_ci | | CountryLanguage | Language | latin1_swedish_ci | | CountryLanguage | IsOfficial | latin1_swedish_ci | +-----------------+----------------+-------------------+ 14 rows in set (0.01 sec) Copyright© 2012, Oracle. All rights reserved.
  • 25. テーブルの文字コードの確認方法 (4) mysql> select table_schema, table_name, column_name, collation_name from information_schema.columns where collation_name not like 'latin%' and table_schema not in ('mysql', 'information_schema', 'performance_schema'); Empty set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 26. <Insert Picture Here> オプション Copyright© 2012, Oracle. All rights reserved.
  • 27. 文字コード関係のオプション ● character_set_server … データベースの文字コードのデ フォルトになる ● character_set_database … データベースの文字コード。 テーブルの文字コードのデフォルトになる。 CREATE DATABASE 実行時に指定したものと同じ。 ● character_set_connection … クライアントごとに設定可 能な文字コード。 SQL の評価時に適用される。 ● character_set_client … クライアントから送信される文字 データの文字コード。 ● character_set_results … クライアントへ送信される結果 に含まれる文字データの文字コード。 ● character_set_system … テーブル名などの文字コード。 常に utf8 。 ● character_set_filesystem … ファイルシステムへアクセ スする際に用いられる文字コード。 Copyright© 2012, Oracle. All rights reserved.
  • 28. 照合順序関係のオプション ● collation_server … データベースの照合順序のデ フォルトになる。 ● collation_database … データベースの照合順序。 テーブルの照合順序のデフォルトになる。 CREATE DATABASE 実行時に指定したものと同じ。 ● collation_connection … クライアントごとに設定可 能な照合順序。 SQL の評価時に適用される。 Copyright© 2012, Oracle. All rights reserved.
  • 29. skip_character_set_client_handshake ● クライアントが指定した文字コードを無視してサー バーが指定した文字コードを使用 ● C API や PHP 利用時に便利 ● Connector/J では効かないので注意 Copyright© 2012, Oracle. All rights reserved.
  • 30. default_character_set ● 古いオプションなのでサーバーでは利用しないよう ● MySQL 5.5 で廃止 ● クライアントでは現在も利用中 Copyright© 2012, Oracle. All rights reserved.
  • 31. <Insert Picture Here> ドライバ Copyright© 2012, Oracle. All rights reserved.
  • 32. C API mysql = mysql_init(NULL); if (!mysql_real_connect(mysql, NULL, "user", "password", "db", 3306, NULL, 0)) { printf("Cannot connect: %s", mysql_error(mysql)); goto err; }; if (mysql_set_character_set(mysql, "utf8")) goto err; Copyright© 2012, Oracle. All rights reserved.
  • 33. PHP ● モジュールごとに指定法が異なる ● MySQL 拡張モジュール( mysql ) … mysql_set_charset() ま たは SET NAMES ● MySQL 改良型拡張モジュール( mysqli ) … mysqli_set_charset() または mysqli::set_charset() または SET NAMES ● PDO … SET NAMES <?php $dbh = mysql_connect('hostname:3306', 'user', 'password'); if (!$dbh) { die('Failed to connect MySQL Server: ' . mysql_error()); } if(!mysql_set_charset('utf8', $dbh)) { die('Failed to change charset.'); } Copyright© 2012, Oracle. All rights reserved.
  • 34. Perl ● mysql_enable_utf8 属性を指定して、 UTF-8 フラグ が有効な文字列を使う。 ● mysql_enable_utf8 属性を指定せず、 MySQL Server から受け取った文字列を decode() 、 MySQL Server へ渡す文字列を encode() する。 my $dbh = DBI->connect( "DBI:mysql:database=db_name;host=hostname", "user", "password", { RaiseError => 1, mysql_enable_utf8=>1 }); Copyright© 2012, Oracle. All rights reserved.
  • 35. Java ( Connector/J ) ● 文字コードは characterEncoding プロパティで指定 ● 指定がない場合には接続先の character_set_server により決 定。接続後 SET NAMES をドライバが実行。 ● --skip-character-set-client-handshake は効かない ● characterEncoding が何であれ Java の文字列は ucs2 に変換される。 Class.forName("com.mysql.jdbc.Driver"); Properties props = new Properties(); props.setProperty("user", "mikiya"); props.setProperty("password", "mikiya's password"); props.setProperty("characterEncoding", "UTF-8"); conn = DriverManager.getConnection(url, props); Copyright© 2012, Oracle. All rights reserved.
  • 36. Ruby #!/usr/bin/ruby -Ks : my = Mysql.init() my.options(Mysql::SET_CHARSET_NAME, 'cp932') my.real_connect('127.0.0.1', 'user', 'password', 'db') res = my.query('SELECT some_str_col FROM some_tbl WHERE...'); res.each do |row| puts row[0] # シフト JIS ( Cp932 )で出力されま す。 : end Copyright© 2012, Oracle. All rights reserved.
  • 37. <Insert Picture Here> 文字コード関係の トラブル Copyright© 2012, Oracle. All rights reserved.
  • 38. 文字化けの原因と対策 ● 実際のデータと文字コードが一致していないと化け る。 ● 接続用の文字コードは問題ないか? – アプリケーションが期待している文字コードとドライバの文 字コードは同じか? ● 端末の文字コードは問題ないか? ● テーブル内のデータは問題ないか? Copyright© 2012, Oracle. All rights reserved.
  • 39. LOAD DATA INFILE/SELECT … INTO OUTFILE ● LOAD DATA INFILE ● ファイルの文字コードが character_set_database になってい ることを期待している ● SET character_set_database = charset_name ● テーブルの文字コードと同じ場合には binary を指定する ● mysqlimport を使う ● SELECT … INTO OUTFILE ● デフォルトでは文字コード変換しない – LOAD DATA で読むときは binary を指定すると良い ● SELECT … INTO OUTOFILE 'file_name' CHARACTER SET charset_name ... Copyright© 2012, Oracle. All rights reserved.
  • 40. latin1 で格納されている? ● セッションの文字コードもテーブルの文字コードも latin1 の場合、文字コードの変換が起きないので、 文字化けも起きない。 ● 照合順序が狂ってしまう (latin1_swedish_ci を用い て 1 バイトずつ比較されてしまう ) ● 本来の文字コードを指定して接続すると , 文字化け してしまう Copyright© 2012, Oracle. All rights reserved.
  • 41. latin1 で格納されている?(つづき) mysql> set names latin1; Query OK, 0 rows affected (0.00 sec) mysql> create table t (a char(30) character set latin1); Query OK, 0 rows affected (0.00 sec) mysql> insert into t values(' これはテストです。 '); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +-----------------------------+ | a | +-----------------------------+ | これはテストです。 | +-----------------------------+ 1 row in set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 42. 5C 問題 Shift_JIS の2バイト目が 0x5C (¥)であることに起 因する問題。リテラルとして解釈すると 0x5C がエス ケープ文字として扱われてしまう。 mysql> set names sjis; mysql> set names latin1; Query OK, 0 rows Query OK, 0 rows affected (0.00 sec) affected (0.00 sec) mysql> select ' 表 abc'; mysql> select ' 表 abc'; +-------+ +------+ | 表 abc | | 病 bc | +-------+ +------+ | 表 abc | | 病 bc | +-------+ +------+ 1 row in set (0.00 sec) 1 row in set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 43. ラウンドトリップ変換 mysql> create table t (a char(1) character set eucjpms); Query OK, 0 rows affected (0.01 sec) mysql> insert into t values(unhex('8FA2B7')); Query OK, 1 row affected (0.01 sec) mysql> select hex(a) from t; +--------+ | hex(a) | +--------+ | 8FA2B7 | +--------+ 1 row in set (0.00 sec) mysql> select hex(convert(convert(a using cp932) using eucjpms)) from t; +----------------------------------------------------+ | hex(convert(convert(a using cp932) using eucjpms)) | +----------------------------------------------------+ | A1C1 | +----------------------------------------------------+ 1 row in set (0.00 sec) Copyright© 2012, Oracle. All rights reserved.
  • 44. <Insert Picture Here> まとめ Copyright© 2012, Oracle. All rights reserved.
  • 45. まとめ ● MySQL で利用可能な日本語対応文字コードの種類 ● MySQL はカラムごと、セッションごとに文字コー ドを指定可能 ● 文字コードが異なる場合には自動変換 ● 自動変換が起きないようにするのが理想 ● 使用するプログラミング言語にあわせて、正しく文字コードを指 定する ● 迷ったらすべて utf8 で統一する ● SHOW コマンドや INFORMATION_SCHEMA で使 用中の文字コードを確認 Copyright© 2012, Oracle. All rights reserved.
  • 46. 46 宣伝 ● 好評につき「エキスパートのための MySQL [運 用+管理]トラブルシューティングガイド」 近日増 刷予定 !! ● 様々な角度から MySQL のトラブルを解析するのに役立つ書籍 です。ぜひ安心な DBA 生活のお供に一冊どうぞ。 ● Contents ● 第 1 章 MySQL の概要 ● 第 2 章 開発時における問題 ● 第 3 章 MySQL の状態を見る ● 第 4 章 DTrace ● 第 5 章 運用中に起きる諸問題 ● 第 6 章 堅牢な運用を実現するために ● 第 7 章 ソースコードのビルド Copyright© 2012, Oracle. All rights reserved.
  • 47. <Insert Picture Here> Copyright© 2012, Oracle. All rights reserved.
  • 48. Copyright© 2012, Oracle. All rights reserved.
  • 49. 49 Copyright© 2012, Oracle. All rights reserved.