Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
次第に日本語の旅らしくなってきた。 ここでは、文字列の文字コードの変更をやってみよう。
なお、端末は EUC-JPである。
まず、'漢字'という文字列について、16進数表示をしておく。 どのように変換されたかの詳細は16進数にして確認するに限る。
mysql> SET NAMES ujis;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT '漢字', HEX('漢字');
+------+-------------+
| 漢字 | HEX('漢字') |
+------+-------------+
| 漢字 | B4C1BBFA |
+------+-------------+
1 row in set (0.03 sec)
CONVERT() による文字列の型変換
マニュアルによると、CONVERT()による文字列のキャラクタセットの変換は 以下のようになっている。
文字列の型を変換する関数
CONVERT( 文字列 USING キャラクタセット )
ということなので、まず使ってみよう。
mysql> SELECT CONVERT('漢字' USING sjis);
+----------------------------+
| CONVERT('漢字' USING sjis) |
+----------------------------+
| 漢字 |
+----------------------------+
1 row in set (0.06 sec)
うまくいっているのかなぁ。
sjisに変換したので、端末はEUC-JPだったら文字化けしそうなものだが、 ちゃんと表示される。そうだ、サーバ・クライアント間で、 MySQLはちゃんと(あるいは勝手に)キャラクタセットの調整をしてしまうのであった。
ということは、
mysql> SELECT HEX(CONVERT('漢字' USING sjis));
+---------------------------------+
| HEX(CONVERT('漢字' USING sjis)) |
+---------------------------------+
| 8ABF8E9A |
+---------------------------------+
1 row in set (0.00 sec)
とHEX()を使って16進数表示にして確認するとか、
mysql> SELECT CHARSET(CONVERT('漢字' USING sjis));
+-------------------------------------+
| CHARSET(CONVERT('漢字' USING sjis)) |
+-------------------------------------+
| sjis |
+-------------------------------------+
1 row in set (0.00 sec)
CHARSET()を使って、文字列のキャラクタを調べると確認できるわけだ。
どちらでも、ちゃんとなっているようだ。
ラウンドトリップコンバージョン(round-trip conversion:可逆変換)
キャラクタセットの変換を行なった結果に対して、それを元にもどす変換、 つまり 逆変換 を行なうと、ちゃんとしていれば元に戻るはずである。
たとえば、 ujis → sjis → ujis としたとき、元に戻るということ。 これが正しくないと、キャラクタセットの変換をしていくと、次第に文字列が 壊れていくという現象が起きてしまう。
さて、どうなるか調べてみよう。
mysql> SELECT HEX(CONVERT(CONVERT('漢字' USING sjis) USING ujis)), HEX('漢字');
+-----------------------------------------------------+-------------+
| HEX(CONVERT(CONVERT('漢字' USING sjis) USING ujis)) | HEX('漢字') |
+-----------------------------------------------------+-------------+
| B4C1BBFA | B4C1BBFA |
+-----------------------------------------------------+-------------+
1 row in set (0.00 sec)
つぎに、ujis → utf8 → ujis で調べてみよう。
mysql> SELECT HEX(CONVERT(CONVERT('漢字' USING utf8) USING ujis)), HEX('漢字');
+-----------------------------------------------------+-------------+
| HEX(CONVERT(CONVERT('漢字' USING utf8) USING ujis)) | HEX('漢字') |
+-----------------------------------------------------+-------------+
| B4C1BBFA | B4C1BBFA |
+-----------------------------------------------------+-------------+
これも大丈夫みたいだ。
漢字はとても沢山あるのに、たったこれだけで動いたと思うのは マズイかもしれない。
それに、なにより組み合わせがいっぱい考えられる。あらゆる可能な組み合わせ を全部やらないと、ちゃんとしたテストとは言えない。 でも、これは大変なのでとても私にはできない。誰かやってくれないかな。
フィードバック:
There is no comment.