Open Source WEB

CONVERT()で文字列のキャラクタセットを変換したが、 CASTを使っても同じことができる。

ここでも、端末の文字コードは EUC-JPとする。

文字列の型を変換する関数

CAST( 文字列 AS CHAR CHARACTER SET キャラクタセット )

やけに無駄が多いとしか思えない仕様でとても気に入らないので、 もっと短い CAST( 文字列 AS キャラクタセット ) について調べてみよう。

mysql> SELECT CAST('漢字' AS sjis);
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 'sjis)' at line 1

どうもダメらしい。仕方がないので、やむなく仕様通りにして確認しよう。

mysql> SELECT CAST('漢字' AS CHAR CHARACTER SET sjis);
+-----------------------------------------+
| CAST('漢字' AS CHAR CHARACTER SET sjis) |
+-----------------------------------------+
| 漢字                                    |
+-----------------------------------------+
1 row in set (0.00 sec)

動いているようだが、これでは分らないので、CONVERT()の時と同じように、 16進数にしたり、キャラクタセットを関数で調べてみよう。

mysql> SELECT HEX(CAST('漢字' AS CHAR CHARACTER SET sjis));
+----------------------------------------------+
| HEX(CAST('漢字' AS CHAR CHARACTER SET sjis)) |
+----------------------------------------------+
| 8ABF8E9A                                     |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CHARSET(CAST('漢字' AS CHAR CHARACTER SET sjis));
+--------------------------------------------------+
| CHARSET(CAST('漢字' AS CHAR CHARACTER SET sjis)) |
+--------------------------------------------------+
| sjis                                             |
+--------------------------------------------------+
1 row in set (0.00 sec)

CAST()と CONVERT() で同じことをやってみよう。

mysql> SELECT HEX(CAST('漢字' AS CHAR CHARACTER SET sjis)),
    ->        HEX(CONVERT('漢字' USING sjis));
+----------------------------------------------+---------------------------------+
| HEX(CAST('漢字' AS CHAR CHARACTER SET sjis)) | HEX(CONVERT('漢字' USING sjis)) |
+----------------------------------------------+---------------------------------+
| 8ABF8E9A                                     | 8ABF8E9A                        |
+----------------------------------------------+---------------------------------+
1 row in set (0.00 sec)

やっぱり、CONVERT()の方がシンプルでいいや。


ラウンドトリップコンバージョン(round-trip conversion:可逆変換)

CAST()でも、ラウンドトリップコンバージョンができるかな。

mysql> SELECT HEX(CAST(CAST('漢字' AS CHAR CHARACTER SET sjis) AS CHAR CHARACTER SET ujis));  
+-------------------------------------------------------------------------------+
| HEX(CAST(CAST('漢字' AS CHAR CHARACTER SET sjis) AS CHAR CHARACTER SET ujis)) |
+-------------------------------------------------------------------------------+
| B4C1BBFA                                                                      |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

もっとエスカレートして、CAST()で変換したのをCONVERT()で元に戻すとか、 その逆だって考えられる。

mysql> SELECT HEX(CONVERT(CAST('漢字' AS CHAR CHARACTER SET sjis) USING ujis));
+------------------------------------------------------------------+
| HEX(CONVERT(CAST('漢字' AS CHAR CHARACTER SET sjis) USING ujis)) |
+------------------------------------------------------------------+
| B4C1BBFA                                                         |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT HEX(CAST(CONVERT('漢字' USING sjis) AS CHAR CHARACTER SET ujis));
+------------------------------------------------------------------+
| HEX(CAST(CONVERT('漢字' USING sjis) AS CHAR CHARACTER SET ujis)) |
+------------------------------------------------------------------+
| B4C1BBFA                                                         |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

CAST()は文字列のキャラクタセットの変換用ではない

CAST()でキャラクタセットの変換を行なおうとすると、 USING()よりも長ったらしくなり、とても使う気にはなれない。

本来は、別の用途のために作られたのがCAST()である。 たとえば、-1 という負の数を unsigned としてしまうとどうなるかなどであるが、 「日本語の旅」とは関係ない話題なので、詳しくは自分で調べてくれ。

mysql> SELECT CAST( -1 AS unsigned);
+-----------------------+
| CAST( -1 AS unsigned) |
+-----------------------+
|  18446744073709551615 |
+-----------------------+
1 row in set (0.00 sec)

戻る:CONVERT()でキャラクタセットの変換をする

次へ:UNHEX()で16進数表記から文字列を作る


フィードバック:

Name:
Comment:

There is no comment.

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

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