mysqlの文字コード
TRANSCRIPT
MySQLの文字コード Powered by Rabbit 0.9.2
MySQLの文字コード
とみたまさひろ2011-04-29
MySQLの文字コード Powered by Rabbit 0.9.2
自己紹介
とみた まさひろ✓
プログラマー✓
mailto:[email protected]✓
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の文字コー
ド7/36
MySQLの文字コード Powered by Rabbit 0.9.2
MySQLとは(ry
8/36
MySQLの文字コード Powered by Rabbit 0.9.2
charset と
collation9/36
MySQLの文字コード 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
文字化け
23/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) |+--------+--------+| 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() で確かめる
26/36
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
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
ただしカラムのインデックスが使われなくなるので注意
35/36
MySQLの文字コード Powered by Rabbit 0.9.2
まとめ
文字コード周りはややこしい✓
「?」が出たら HEX()✓
utf8 に揃えると楽チン✓
36/36