寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

23
寿司blogがかけなくて嵌った話 KenichiroMATOHARA(matoken) <[email protected] > 鹿児島Linux勉強会 2014-09-27(Fri)

description

"鹿児島Linux勉強会-第05回- - 鹿児島らぐ | Doorkeeper" http://kagolug.doorkeeper.jp/events/15186 で発表したWordPressで絵文字の投稿が出来なくて嵌った話.

Transcript of 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

Page 1: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

寿司blogがかけなくて嵌った話

KenichiroMATOHARA(matoken)<[email protected]>

鹿児島Linux勉強会2014-09-27(Fri)

Page 2: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

Kenichiro MATOHARA

● ID : matoken● http://matoken.org/

● 興味– Linux

– FLOSS

– OpenSteetmap– 電子工作– :

Page 3: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

「鹿児島らぐ(Kagoshima Linux User Group)」を立ち上げましたhttp://kagolug.org/

鹿児島のお友達に教えてあげてね

Page 4: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

鹿児島らぐ

● 今のところ鹿児島Linux勉強会を月1回開催– 今回で0-5で6回開催

● 鹿児島Linux勉強会– Linux読書会

– Linux関連の発表

● その他– OSMもそろそろやりたい

– 明日 > "鹿児島 OpenStreetMap mini mapping party! : ATND" https://atnd.org/events/56893

Page 5: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

● 自己紹介 18:00〜● Linux読書会〜19:30

● 休憩 〜19:40

● 発表 〜20:50

● 撤収 20:50

● 懇親会(てげWeb合同)

Page 6: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

寿司Blog を書こうとして嵌まる

     ミ

Page 7: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

WordPressで寿司(絵文字)についてのエントリを書こうとする

Page 8: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

WordPressで絵文字以降が保存時に消えてしまう

保存

Page 9: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

WordPressの問題?

● 絵文字プラグインとかあるし絵文字使ってる人も居る

● Versionも問題無さそう

Page 10: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

DB(MySQL)の問題!

● MySQL 5.5.3 より前は3バイトまでの対応● MySQL 5.5.3 以降で4バイトに対応して

Unicode6 の絵文字「�(寿司)」や「�(ほっけ)」とかもOKに

● dbの文字コードはutf8のままではダメでutf8mb4 にする必要があるそう

Page 11: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

リリースノートより

● “MySQL :: MySQL 5.5 Release Notes :: Changes in MySQL 5.5.3 (2010-03-24, Milestone 3)” http://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-3.htmlThe utf8mb4 character set has been added. This is similar to utf8, but its encoding allows up to four bytes per character to enable support for supplementary characters.

Page 12: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

ディストリビューションの対応状況

● CentOS 6.5 の環境は未だ多そう

※Debianはパッケージ管理コマンドより,その他はDistroWatch より確認 http://distrowatch.com/

Page 13: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

実際に試してみる

● 環境– Debian Wheezy

– MySQL 5.5.38-0+wheezy1

Page 14: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

db utf8 で 4バイト文字を書き込んでみる

aa

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTERON test_utf8.*TO test_utf8@localhostIDENTIFIED BY 'XXXXXXXXXX';CREATE DATABASE test_utf8 CHARACTER SET utf8;USE test_utf8;CREATE TABLE test_utf8.moji(id int, moji text);INSERT INTO test_utf8.moji(id, moji) values( '1', 'あいうえお' );INSERT INTO test_utf8.moji(id, moji) values( '2', '寿司�susi' );FLUSH PRIVILEGES;

$ mysqldump -uroot -p -t test_utf8 moji | grep 'INSERT INTO'INSERT INTO `moji` VALUES (1,'あいうえお'),(2,'寿司');

4バイト文字以降が消えた → WordPress での動きと一緒

Page 15: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

一旦db削除DROP DATABASE test_utf8;DELETE FROM mysql.user WHERE user='test_utf8' and host='localhost';FLUSH PRIVILEGES;

Page 16: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

db にutf8mb4を指定して4バイト文字を書き込んでみる

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTERON test_utf8.*TO test_utf8@localhostIDENTIFIED BY 'XXXXXXXXXXXXX';CREATE DATABASE test_utf8 CHARACTER SET utf8mb4;USE test_utf8;CREATE TABLE test_utf8.moji(id int, moji text) CHARACTER SET utf8mb4;INSERT INTO test_utf8.moji(id, moji) values( '1', 'あいうえお' );INSERT INTO test_utf8.moji(id, moji) values( '2', '寿司�susi');FLUSH PRIVILEGES;

$ mysqldump -uroot -p -t test_utf8 moji | grep 'INSERT INTO'Enter password: INSERT INTO `moji` VALUES (1,'あいうえお'),(2,'寿司????susi');

あれ?4バイト取られてますが,「&#x01f363;」 ではなく「????」になってしまっています….

Page 17: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

文字コードを確認

$ mysqldump -uroot -p -t test_utf8 moji | grep 'INSERT INTO'|od -xc0000000 4e49 4553 5452 4920 544e 204f 6d60 6a6f I N S E R T I N T O ` m o j0000020 6069 5620 4c41 4555 2053 3128 272c 81e3 i ` V A L U E S ( 1 , ' 343 2010000040 e382 8481 81e3 e386 8881 81e3 278a 2c29 202 343 201 204 343 201 206 343 201 210 343 201 212 ' ) ,0000060 3228 272c afe5 e5bf b88f 3f3f 3f3f 7573 ( 2 , ' 345 257 277 345 217 270 ? ? ? ? s u0000100 6973 2927 0a3b s i ' ) ; \n0000106

`3f` なのでそのまま `?` ですね….ファイルから書き込んでるので途中でおかしくなってるのかも?

Page 18: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

MySQL の端末から書いてみる

mysql> INSERT INTO test_utf8.moji(id, moji) values( '3', '寿司�ssusi' );Query OK, 1 row affected (0.05 sec)

mysql> select * from moji;ERROR 1046 (3D000): No database selectedmysql> select * from test_utf8.moji;+------+-----------------+| id | moji |+------+-----------------+| 1 | あいうえお || 2 | 寿司????susi || 3 | 寿司�ssusi |+------+-----------------+3 rows in set (0.00 sec)

OKぽい

Page 19: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

dbの変換

● utf8のdbをutf8mb4に変換する

mysql> alter table dbname convert to character set utf8mb4;– 念の為実行前にバックアップはとっとく

Page 20: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

WordPress側の設定

$ tail -3 /etc/wordpress/config-org.php

define('DB_CHARSET', 'utf8mb4');

define('DB_COLLATE', 'utf8mb4_general_ci');

?>

Page 21: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

WordPressで寿司の投稿に成功!

Page 22: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

別解

● 数値文字参照…

&#x01f363;

● dbのバージョンを上げられないならおすすめ.

Page 23: 寿司blogが書けなくて嵌った話(MySQL/絵文字対応)

     ミ