Open Source WEB

次第に日本語の旅らしくなってきた。 ここでは、文字列の文字コードの変更をやってみよう。

なお、端末は 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    |
+-----------------------------------------------------+-------------+

これも大丈夫みたいだ。

漢字はとても沢山あるのに、たったこれだけで動いたと思うのは マズイかもしれない。

それに、なにより組み合わせがいっぱい考えられる。あらゆる可能な組み合わせ を全部やらないと、ちゃんとしたテストとは言えない。 でも、これは大変なのでとても私にはできない。誰かやってくれないかな。


戻る:CHARSET()でさらなるキャラクタセットの調査

次へ:CAST()でもキャラクタセットの変換ができる


フィードバック:

Name:
Comment:

There is no comment.

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

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