Open Source WEB

MySQLもキャラクタ端末もどちらも EUC-JP にしておこう。

ここで、'漢字'という文字列を調べてみよう。 まずは、単純に、'漢字' を SELECT してみよう。

mysql> SELECT '漢字';
+------+
| 漢字 |
+------+
| 漢字 |
+------+

MySQLには、文字列関数 HEX が用意されていて、引数に文字列を与えると、 その文字列を16進数表示した文字列を返してくる。

mysql> SELECT HEX('漢字');
+-------------+
| HEX('漢字') |
+-------------+
| B4C1BBFA    |
+-------------+

これは、EUC-JPの文字列 '漢字' の16進数表記であることが、 別のキャラクタ端末を開き、端末を同じ文字コードのEUC-JPにセットしてから、 以下を実行することで確認できる。

$ echo -n '漢字' | xxd -g 1
0000000: b4 c1 bb fa                                      ....

HEX(文字列)─→ 16進数表記


キャラクタ端末がSJISで、MySQLがUJISの場合

まず、キャラクタ端末の文字コードだけをSJISに変更してやってみよう。

mysql> SELECT '漢字';
+------+
| ??   |
+------+
| 漢字 |
+------+

すると、こんなことになってしまい、 下側の結果表示の方は正常に表示されているものの、タイトルの方は 変になってしまった。

さらに、そのときの16進数表示も試みてみよう。

mysql> SELECT HEX('漢字');
+-------------+
| HEX('????') |
+-------------+
| 8ABF8E9A    |
+-------------+

この結果は SJISのようであるが、以下のようにして一応確かめてみた。

$ echo -n '漢字' | nkf -Es | xxd -g 1
0000000: 8a bf 8e 9a                                      ....

確かにSJISである。

あちこちで ? が表示されてしまうのは、MySQLが文字コードの自動変換を 行なっていて、そのとき変換に失敗すると ? が表示されるためなのである。 詳しくは、この連載の中で次第に分かるようになるのではないかと思う。


キャラクタ端末もMySQLもSJISにした場合

SET NAMES で、MySQLもSJISに設定すると、以下のように、何の問題もなくなる。

mysql> SET NAMES SJIS;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT '漢字';
+------+
| 漢字 |
+------+
| 漢字 |
+------+
1 row in set (0.00 sec)

mysql> SELECT HEX('漢字');
+-------------+
| HEX('漢字') |
+-------------+
| 8ABF8E9A    |
+-------------+
1 row in set (0.00 sec)

要するに、

キャラクタ端末とMySQLの文字コード(文字セット)は同じでなければならない。

でも、いつでもそのように設定できる訳ではない。 どんなクライアントでもmysqlのように色々設定可能とは限らないので、 そのときには適切に文字コードの変換をしてやらなければならない。

クライアントとサーバでの文字コードが違うと、MySQLは適切だったり、 不適切な変換を行なうことがあり、そのあたりをきちんと制御しなければならない。 文字化けは、そのとき失敗して変な表示になるケースが圧倒的に多いようだ。 通常はMySQLサーバとの接続の直後に、 SET NAMES で適切なキャラクタセットに設定すると大丈夫になる。

面倒かも知れないが、日本語を扱う以上避けては通れない。


戻る:キャラクタコード変換ツール(nkf, iconv, kcc)

次へ:HEX()でキャラクタセットの調査 (その1)


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us