Open Source WEB

16進数文字列から文字列に直す方法として、 以下の2つの方法を既に示した。

mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT 0xB4C1BBFAC9BDBCA8;
+--------------------+
| 0xB4C1BBFAC9BDBCA8 |
+--------------------+
| 漢字表示           |
+--------------------+
1 row in set (0.00 sec)
 
mysql> SELECT x'B4C1BBFAC9BDBCA8';
+---------------------+
| x'B4C1BBFAC9BDBCA8' |
+---------------------+
| 漢字表示            |
+---------------------+

しかし、この方法ではSQL文の中でデータとして与えられた場合には困る。

つまり、'B4C1BBFAC9BDBCA8'だけが与えられる場合である。たとえばテーブル中に 文字列として 'B4C1BBFAC9BDBCA8' が入っていたとき、これを '漢字表示' に変換するにはどうすればよいだろうか。

というので調べてみたら、HEX()の逆をやってくれる関数 UNHEX()なるものが用意 されていた。

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

もちろん、変数に16進数文字列を入れておいて、後でUNHEX関数で文字列にする こともできる。

mysql> SET @str = 'B4C1BBFAC9BDBCA8';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT UNHEX(@str);
+-------------+
| UNHEX(@str) |
+-------------+
| 漢字表示    |
+-------------+
1 row in set (0.00 sec)

HEX()()の逆関数がUNHEXなので、2つを組み合わせれば元に戻すこともできる。

mysql> SELECT UNHEX(HEX('堂々巡り')),
    -> UNHEX(HEX(UNHEX(HEX('堂々巡り'))));
+------------------------+------------------------------------+
| UNHEX(HEX('堂々巡り')) | UNHEX(HEX(UNHEX(HEX('堂々巡り')))) |
+------------------------+------------------------------------+
| 堂々巡り               | 堂々巡り                           |
+------------------------+------------------------------------+
1 row in set (0.00 sec)

UNHEX()の返す文字列のキャラクタセットは何になっているか

文字列のキャラクタセットを求める関数はCHARSET()であった。

mysql> SELECT CHARSET(UNHEX(HEX('堂々巡り')));
+---------------------------------+
| CHARSET(UNHEX(HEX('堂々巡り'))) |
+---------------------------------+
| binary                          |
+---------------------------------+
1 row in set (0.00 sec)

UNHEX()が返してくる文字列は binary になってしまった。 SET NAMES eucjpms をやったのだから、eucjpms になってくれてもよさそうな ものだが、そうはならない。ちゃんとマニュアルにも binary を返すとある。

ならば、eucjpms にしてしまうのはどうすれば良いだろうか。 さっそく introducer を試してみよう。

mysql> SELECT _eucjpms UNHEX(HEX('堂々巡り'));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near 'UNHEX(HEX('堂々巡り'))' at line 1

ということで、使えないようだ。さて、どうしよう。

キャラクタセットを変換するには、CONVERT()という関数を使う方法があった。

mysql> SELECT CONVERT( UNHEX(HEX('堂々巡り')) USING eucjpms);
+------------------------------------------------+
| CONVERT( UNHEX(HEX('堂々巡り')) USING eucjpms) |
+------------------------------------------------+
| 堂々巡り                                       |
+------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CONVERT( UNHEX(HEX('堂々巡り')) USING eucjpms));
+---------------------------------------------------------+
| CHARSET(CONVERT( UNHEX(HEX('堂々巡り')) USING eucjpms)) |
+---------------------------------------------------------+
| eucjpms                                                 |
+---------------------------------------------------------+
1 row in set (0.00 sec)

さらにもう1つ、CAST()を使う方法もあった。こっちは無駄に面倒臭い。

mysql> SELECT CAST( UNHEX(HEX('堂々巡り')) AS CHAR CHARACTER SET eucjpms);
+-------------------------------------------------------------+
| CAST( UNHEX(HEX('堂々巡り')) AS CHAR CHARACTER SET eucjpms) |
+-------------------------------------------------------------+
| 堂々巡り                                                    |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CAST( UNHEX(HEX('堂々巡り')) AS CHAR CHARACTER SET eucjpms));
+----------------------------------------------------------------------+
| CHARSET(CAST( UNHEX(HEX('堂々巡り')) AS CHAR CHARACTER SET eucjpms)) |
+----------------------------------------------------------------------+
| eucjpms                                                              |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)

それにしても、なんで introducer を使わしてくれないんだろう。 introducerの使い方がどうも中途半端な気がしてならない。


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

次へ:バックスラッシュ(\,5C)が文字化けする


フィードバック:

Name:
Comment:

There is no comment.

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

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