Mysql charset

31
MySQLの文字コード - OSC2011.DB Powered by Rabbit 1.0.4 MySQLの 文字コード OSC2011.DB とみたまさひろ 日本MySQLユーザ会 2011-11-05

Transcript of Mysql charset

Page 1: Mysql charset

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

MySQLの文字コード

OSC2011.DB

とみたまさひろ日本MySQLユーザ会

2011-11-05

Page 2: Mysql charset

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

自己紹介

とみたまさひろ✓

日本MySQLユーザ会✓

長野ソフトウェア技術者グループ(NSEG)✓

mailto:[email protected]

id:tmtms✓

@tmtms✓

1/30

Page 3: Mysql charset

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

MySQLの文字コード

2/30

Page 4: Mysql charset

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

charset と

collation3/30

Page 5: Mysql charset

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

charset

コードと文字との対応✓

show charset✓

utf8mb4 : 4バイトUTF-8 (MySQL5.5から)✓

utf8 : 3バイトUTF-8✓

eucjpms, cp932, ...✓

4/30

Page 6: Mysql charset

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

collation

文字の照合規則✓

show collation✓

utf8_general_ci, utf8_bin, utf8_unicode_ci, ...

5/30

Page 7: Mysql charset

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

utf8_general_ci

charset utf8 のデフォルトの collation✓

ASCII/ラテン文字の大文字小文字を区別しない

A = a✓

6/30

Page 8: Mysql charset

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

utf8_bin

char(n) binary として宣言した時の collation✓

すべての文字を区別する✓

A != a✓

7/30

Page 9: Mysql charset

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

Page 10: Mysql charset

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

文字コードが関係するもの

クライアント✓

接続✓

データベース✓

テーブル✓

カラム✓

9/30

Page 11: Mysql charset

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

Page 12: Mysql charset

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

ハマりたくなかったら

utf8 に統一11/30

Page 13: Mysql charset

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

データベース charset

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

create database db1 charset utf8;

show create database db1;

12/30

Page 14: Mysql charset

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

テーブル charset

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

create table t1 (...) charset utf8;

show create table t1;

13/30

Page 15: Mysql charset

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

Page 16: Mysql charset

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

接続

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

set names utf8;

15/30

Page 17: Mysql charset

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

Page 18: Mysql charset

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

文字化け

17/30

Page 19: Mysql charset

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) |+--------+--------+| 3F | E298BA |+--------+--------+

18/30

Page 20: Mysql charset

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

Page 21: Mysql charset

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

「?」が出たらとりあえず

HEX() で確かめる

20/30

Page 22: Mysql charset

MySQLの文字コード - OSC2011.DB 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

Page 23: Mysql charset

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

注意

これらの変数はセッション変数✓

接続毎に異なる値をとりうる✓

PHPから文字化けしてるのに、mysql コマンドで確かめても意味ない!

22/30

Page 24: Mysql charset

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

charset を混在させないといけない事情

23/30

Page 25: Mysql charset

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

Page 26: Mysql charset

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

Page 27: Mysql charset

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

これは大丈夫

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

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

26/30

Page 28: Mysql charset

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

優先順位

明示的な collate 指定✓

カラムの collation✓

リテラルの collation✓

27/30

Page 29: Mysql charset

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

Page 30: Mysql charset

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

ただしカラムのインデックスが使われなくなるので注意

29/30

Page 31: Mysql charset

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

まとめ

文字コード周りはややこしい✓

「?」が出たら HEX()✓

utf8 に揃えると楽チン✓

30/30