FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このまえ発見したのでメモ。

[現象]
MySQLで、普通の文字は化けないのに「①」や「℡」、「㈱」、「㍻」などの特殊文字だけが化ける

[原因]
サーバの文字コードとデータベース(テーブル)の文字コードが違っている。

[化ける例]
①クライアントをEUC-JPに設定
②"SET NAMES UJIS;"クエリを実行
③DEFAULT CHARSETがUTF8のテーブルにINSERT

※INSERTするテーブルがUJISの場合は化けません。

[結論]
特殊文字の文字化けも防ぐためには、テーブルの文字コードも合わせる必要がある。SET NAMESクエリでサーバ・クライアント間の文字コードを合わせるだけでは不十分。

[補足]
EUCJPMSとUTF8の文字コード変換には高度な互換性があるので、この二つを使う場合は化けずにやりとりできます。
たとえば
・SET NAMES EUCJPMS;
・テーブルの文字コードはUTF8
の組み合わせなどです。


上記の結論に至った実験内容を続きにまとめます。


<実験その1:クライアントがEUC-JPの場合>

実験手順:
①EUC-JPのクライアントを用意する
②INSERTする直前にSET NAMESクエリを流す
③文字コードがUTF8、UJIS、EUCJPMSの各テーブルに以下の特殊文字列をINSERT

あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!"#$%&\'()-=^~\|表ソ十

④INSERTしたものをSELECTしてクライアントで表示させる

実験結果:
"SET NAMES UJIS;"した場合

UTF8テーブル => あいうえお~∥¢£¬アイウエオ?????????????∫僦 僨 僩 僯 僱 僶!"#$%&\'()-=^~\|表ソ十
UJISテーブル => あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!"#$%&\'()-=^~\|表ソ十
EUCJPMSテーブル => あいうえお?????アイウエオ?????????????∫僦 僨 僩 僯 僱 僶!"#$%&\'()-=^~\|表ソ十


"SET NAMES EUCJPMS;"した場合

UTF8テーブル => あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!\"#$%&\\\'()-=^~\\|表ソ十
UJISテーブル => あいうえお?????アイウエオ????????№????∫僦 僨 僩 僯 僱 僶!\"#$%&\\\'()-=^~\\|表ソ十
EUCJPMSテーブル => あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!\"#$%&\\\'()-=^~\\|表ソ十


"SET NAMES UTF8;"した場合

UTF8テーブル =>
UJISテーブル => ?????????????臓???????????????????????亅????????????????? ??? ??? ??? ??? ???!\\\"#$%&\\\\\\\'()-=^~\\\\|?????
EUCJPMSテーブル => ?????????????臓???????????????????????亅????????????????? ??? ??? ??? ??? ???!\\\"#$%&\\\\\\\'()-=^~\\\\|?????


まとめ:
化けなかったのは
・SET NAMES UJIS; したUJISテーブル
・SET NAMES EUCJPMS; したUTF8テーブル
・SET NAMES EUCJPMS; したEUCJPMSテーブル
の3通りのみ。
(SET NAMES UTF8の例が化けるのはクライアントがEUC-JPだから当たり前。)



<実験その2:クライアントがUTF-8の場合>

実験結果:
"SET NAMES UJIS;"した場合

UTF8テーブル => ???????????????�???��??£¬アイウエオ�???????????????��?????????????��???��???? ??? ??? ??? ??? ???!"#$%&\'()-=^~\|�??��??
UJISテーブル =>
EUCJPMSテーブル => ???????????????�???��??£¬アイウエオ�???????????????��?????????????��???��???? ??? ??? ??? ??? ???!"#$%&\'()-=^~\|�??��??


"SET NAMES EUCJPMS;"した場合

UTF8テーブル => ???????????????�???��??£¬アイウエオ�???????????????��?????????????��???��???? ??? ??? ??? ??? ???!\"#$%&\\\'()-=^~\\|�??��??
UJISテーブル => ???????????????�???��??£¬アイウエオ�???????????????��?????????????��???��???? ??? ??? ??? ??? ???!\"#$%&\\\'()-=^~\\|�??��??
EUCJPMSテーブル =>


"SET NAMES UTF8;"した場合

UTF8テーブル => あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!\\\"#$%&\\\\\\\'()-=^~\\\\|表ソ十
UJISテーブル => あいうえお?????アイウエオ????????№????∫僦 僨 僩 僯 僱 僶!\\\"#$%&\\\\\\\'()-=^~\\\\|表ソ十
EUCJPMSテーブル => あいうえお~∥¢£¬アイウエオ①⑪Ⅰ㍉㎜㍻〝〟№㏍℡㊨㈱∫僦 僨 僩 僯 僱 僶!\\\"#$%&\\\\\\\'()-=^~\\\\|表ソ十


まとめ:
化けなかったのは
・SET NAMES UTF8; したUTF8テーブル
・SET NAMES UTF8; したEUCJPMSテーブル
の2通りのみ。



まとめのまとめ:
・サーバ・クライアント間と同様、サーバ内で文字コードが一致するなら自動変換は発生しない(EUC-JPクライアントのUJIS->UJISの例より。)
・EUCJPMSとUTF8には高度な互換性がある(少なくともこの例では)
・やっぱりUJISはEUCJPMSに比べてしょぼい

推察:
文字コード変換が発生し得るタイミングは、
・クライアント->サーバの通信
・サーバにデータが届いてテーブルに格納されるまでの間
・テーブルからデータを取り出すとき
・サーバ->クライアントの通信
の4カ所ある。この4つの文字コードを統一すれば完璧だが、
それが無理なら互換性の高い文字コードの組み合わせを選ぶしかない。
スポンサーサイト

コメント

このコメントは管理人のみ閲覧できます
このコメントは管理者の承認待ちです
このコメントは管理者の承認待ちです
このコメントは管理者の承認待ちです

コメントの投稿

  • URL
  • コメント
  • パスワード
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL:http://remotehost.blog54.fc2.com/tb.php/34-35c2bd63
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。