Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

鹿児島Linux勉強会 2014-09-27

Kenichiro MATOHARA

September 27, 2014
Tweet

More Decks by Kenichiro MATOHARA

Other Decks in Technology

Transcript

  1. Kenichiro MATOHARA • ID : matoken • http://matoken.org/ • 興味

    – Linux – FLOSS – OpenSteetmap – 電子工作 – :
  2. 鹿児島らぐ • 今のところ鹿児島Linux勉強会を月1回開催 – 今回で0-5で6回開催 • 鹿児島Linux勉強会 – Linux読書会 –

    Linux関連の発表 • その他 – OSMもそろそろやりたい – 明日 > "鹿児島 OpenStreetMap mini mapping party! : ATND" https://atnd.org/events/56893
  3. • 自己紹介 18:00〜 • Linux読書会〜19:30 • 休憩 〜19:40 • 発表

    〜20:50 • 撤収 20:50 • 懇親会(てげWeb合同)
  4. DB(MySQL)の問題! • MySQL 5.5.3 より前は3バイトまでの対応 • MySQL 5.5.3 以降で4バイトに対応して Unicode6

    の絵文字「(寿司)」や「(ほっけ)」 とかもOKに • dbの文字コードはutf8のままではダメで utf8mb4 にする必要があるそう
  5. リリースノートより • “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.html The 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.
  6. db utf8 で 4バイト文字を書き込ん でみる a a GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON

    test_utf8.* TO test_utf8@localhost IDENTIFIED 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 での動きと一緒
  7. db にutf8mb4を指定して4バイト文 字を書き込んでみる GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON test_utf8.* TO test_utf8@localhost IDENTIFIED

    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バイト取られてますが,「🍣」 ではなく「????」になってしまっ ています….
  8. 文字コードを確認 $ mysqldump -uroot -p -t test_utf8 moji | grep

    'INSERT INTO'|od -xc 0000000 4e49 4553 5452 4920 544e 204f 6d60 6a6f I N S E R T I N T O ` m o j 0000020 6069 5620 4c41 4555 2053 3128 272c 81e3 i ` V A L U E S ( 1 , ' 343 201 0000040 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 u 0000100 6973 2927 0a3b s i ' ) ; \n 0000106 `3f` なのでそのまま `?` ですね…. ファイルから書き込んでるので途中でおかしくなってるのかも?
  9. 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 selected mysql> select * from test_utf8.moji; +------+-----------------+ | id | moji | +------+-----------------+ | 1 | あいうえお | | 2 | 寿司????susi | | 3 | 寿司�ssusi | +------+-----------------+ 3 rows in set (0.00 sec) OKぽい
  10. dbの変換 • utf8のdbをutf8mb4に変換する mysql> alter table dbname convert to character

    set utf8mb4; – 念の為実行前にバックアップはとっとく