mysqlの文字コード

37
MySQLの文字コード Powered by Rabbit 0.9.2 MySQLの 文字コード とみたまさひろ 2011-04-29

Upload: masahiro-tomita

Post on 28-May-2015

6.314 views

Category:

Lifestyle


0 download

TRANSCRIPT

Page 1: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

MySQLの文字コード

とみたまさひろ2011-04-29

Page 2: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

自己紹介

とみた まさひろ✓

プログラマー✓

mailto:[email protected]

http://d.hatena.ne.jp/tmtms✓

http://twitter.com/tmtms✓

1/36

Page 3: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

自己紹介

日本Rubyの会✓

日本MySQLユーザ会✓

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

2/36

Page 4: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

自己紹介

こんな本書きました

3/36

Page 5: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

自己紹介

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

4/36

Page 6: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

ベストバリュー賞!!

5/36

Page 7: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

NSEG

#1 Rubyの黒魔術✓

#3 はじめてのRuby拡張ライブラリ

#6 Ruby紹介✓

#11 RSpecとCucumber✓

#13 システムコール✓6/36

Page 8: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

MySQLの文字コー

ド7/36

Page 9: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

MySQLとは(ry

8/36

Page 10: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

charset と

collation9/36

Page 11: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

charset

コードと文字との対応✓

show charset✓

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

utf8 : 3バイトUTF-8✓

eucjpms, cp932, ...✓10/36

Page 12: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

collation

文字の照合規則✓

show collation✓

utf8_general_ci, utf8_bin, utf8_unicode_ci, ...

11/36

Page 13: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

utf8_general_ci

charset utf8 のデフォルトのcollation

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

A = a✓

12/36

Page 14: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

utf8_bin

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

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

A != a✓

13/36

Page 15: Mysqlの文字コード

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

Page 16: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

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

クライアント✓

接続✓

データベース✓

テーブル✓

カラム✓

15/36

Page 17: Mysqlの文字コード

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

Page 18: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

ハマりたくなかったら

utf8 に統一17/36

Page 19: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

データベース charset

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

create database db1 charset utf8;

show create database db1;

18/36

Page 20: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

テーブル charset

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

create table t1 (...) charset utf8;

show create table t1;

19/36

Page 21: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

カラム charset

カラム毎に charset 指定可能

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

20/36

Page 22: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

接続

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

set names utf8;

21/36

Page 23: Mysqlの文字コード

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

Page 24: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

文字化け

23/36

Page 25: Mysqlの文字コード

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

24/36

Page 26: Mysqlの文字コード

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

Page 27: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

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

HEX() で確かめる

26/36

Page 28: Mysqlの文字コード

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

Page 29: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

注意

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

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

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

28/36

Page 30: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

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

29/36

Page 31: Mysqlの文字コード

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

Page 32: Mysqlの文字コード

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

Page 33: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

これは大丈夫

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

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

32/36

Page 34: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

優先順位

明示的な collate 指定✓

カラムの collation✓

リテラルの collation✓

33/36

Page 35: Mysqlの文字コード

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

Page 36: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

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

35/36

Page 37: Mysqlの文字コード

MySQLの文字コード Powered by Rabbit 0.9.2

まとめ

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

「?」が出たら HEX()✓

utf8 に揃えると楽チン✓

36/36