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
関連リンク
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)
フィードバック:
There is no comment.