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
関連リンク
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の使い方がどうも中途半端な気がしてならない。
フィードバック:
There is no comment.