varbinaryで文字化けが直らない・・・
環境
■mysql 5.0.66a-log
■PHP 5.1.6
mysqlのカラムで「varbinary」タイプを使用しているのだが、sqlで引っ張ってきた文字列の日本語が文字化けしてしまう。
調べてみたところ、DBから取得した文字列の文字コードが全て「utf8」の文字コードで取得されている模様。
my.cnfの設定
default-character-set=ujis
init-connect = SET NAMES ujis
skip-character-set-client-handshake
こちらを見れば分かるように、文字コードは全てujisに統一しているのだが、これで変更される文字列タイプはchar,varchar,text,enum,set型だけらしい・・・
そもそもなぜvarbinaryにしたかというと、こちらを参照
BINARY 値が格納される時、特定の長さまでパッド値で右側が詰められます。パッド値は 0x00 です。(ゼロバイト)値は挿入時には右側が 0x00 で詰められ、選択時に後続バイトは削除されません。全てのバイトは、ORDER BY と DISTINCT 操作を含め、比較において重要です。0x00 バイトとスペースは、0x00 < スペースとなり、比較において異なります。
例:BINARY(3) カラムでは、挿入時 'a ' は 'a \0' になります。'a\0' は挿入時 'a\0\0' になります。選択時、両方の値は変更されません。
VARBINARY では、挿入時に詰められる事も、選択時にバイトが削除される事もありません。全てのバイトは、ORDER BY と DISTINCT 操作を含め、比較において重要です。0x00 バイトとスペースは、0x00 < スペースとなり、比較において異なります。
http://dev.mysql.com/doc/refman/5.1/ja/binary-varbinary.html
要するに'a'と'a 'と'A'は「違う文字」ということを厳密に定義したかったからなのだが・・・orz
ちなみにvarcharとかだと全部「=」の扱いになってしまうらしい!!!!
次はmysqlの今の設定がどうなっているか調べてみる。
mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | ujis | | character_set_connection | ujis | | character_set_database | ujis | | character_set_filesystem | binary | | character_set_results | ujis | | character_set_server | ujis | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
varbinary等はクライアントから送信された文字をそのままDBに入れて、そのままDBから出すって事(合ってる?)だから、クライアントからどのような文字コードでmysqlに送信されているかを調べる必要がありそうだ。
現在のクライアントエンコーディングは下記の関数で取得可能。
mysql_client_encoding($link)
$conn = mysql_connect('localhost','hoge','hoge'); print mysql_client_encoding($conn);
結果
latin1
う〜〜んはまってきたな・・・
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
以下考察
■まだ試してないが、どうやらmysqlは文字コードを自動化したりしてごにょごにょする機能があるらしい。
http://puchiko.lowtech.ne.jp/?itemid=349&catid=27
-
- with-charset=binary
をして、コンパイル?
my.cnfの記述を
[mysqldump]
default-character_set = binary
他にはmysql_set_charset関数を使ってみるとか・・・
誰か分かったら教えてください〜〜(笑)