MySQLの日本語問題洗い出し

講師:日本MySQLユーザ会/MySQL株式会社 松信嘉範氏

  • 基本
    • CP932、eucjpms、uft8のどれか
    • デフォルトのlatin1は絶対ダメ
      • 初心者のハマり所
    • テーブル、カラムのキャラクタセットを正しく
    • 文字化けの経緯を正しく調べる
      • 格納で化けた?抽出で化けた?表示で化けた?
  • インスタンス全体で統一する
  • my.cnfで設定
  • サーバー/クライアントの両方でキャラクタセットを設定する
    • SHOW VARIABLES LIKE 'CHAR%'
    • SET NAMES
    • init_connect
  • おすすめ
    • character-set-server=文字コード
    • skip-character-set-client-handshake
    • クライアントは何も設定しない
  • 変換せずに格納する方法
  1. prepared
  2. HEX記法
  3. binary
  • 文字が正しく入ったか確認
    • HEX()で16進数表示
      • 格納で化けたのか、抽出で化けたのかを確認
    • 黙視で確認
      • SET NAMES UTF-8
      • HEX(CONVERT(カラム名 USING UTF8))
      • 16進で確認すれば、表示に惑わされない
  • 自動再接続問題
    • 接続中にサーバをリブートしたりすると、クライアントが自動再接続
    • 文字コードがlatin1に戻ってしまう
  • 文字欠落現象
    • [文字1][文字コード範囲外の文字][文字2]
    • ワーニング発生、[文字1]だけが格納され、範囲外の文字以降は切り捨てられる
  • UTF-8 4バイト文字問題
    • UNICODEUCS-2(2バイト)、UCS-4(4バイト)がある
    • MySQL文字コード変換時に内部的にUCS-2を経由する
    • MySQLUTF-8は3バイトまでしか入らない
    • Windows Vistaには4バイトの文字がある
      • 深刻な問題に
    • 当面の対処
      • バイナリとして扱う
      • アプリケーションで弾く
    • 今後
      • MySQLUTF-8を4バイトにする事を検討中
      • ユーザーの意見を聞きたい
  • ShiftJIS + エスケープ + 0x5C(\)問題
    • 「表」など、2バイト目に0x5Cを持つ文字が化ける
    • 対処法
      • ちゃんとCP932を設定する
      • そもそもShiftJISを使わない
  • バイナリデータとShiftJISで0x5C問題
    • ダンプしたデータが破損
    • mysqldumpに --hex-blobを付ける
    • mysql_hex_stringを使おう!
    • 多少容量が増えるが、データ破損よりマシ