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
関連リンク
前回、マニュアル中のCONCAT()の説明を紹介したが、 その中に以下の説明があった。
If the arguments include any binary strings, the result is a binary string.
つまり、
CONCAT()の結合するパラメータ文字列の1つでもbinary文字列だったら、 結果はbinaryになる
ということであり、今回はこれについて調べる。
まず、binaryの文字列の作り方を思い出そう。
mysql> SELECT CHARSET(_binary'abc'), _binary'abc'; +-----------------------+-----+ | CHARSET(_binary'abc') | abc | +-----------------------+-----+ | binary | abc | +-----------------------+-----+ 1 row in set (0.00 sec) mysql>
ところで 'abc' とだけ書くと、このキャラクタセットは何になるであろうか。 なお、今は、以下のように、SET NAMES eucjpms; を行なった状態である。
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | eucjpms | | character_set_connection | eucjpms | | character_set_database | latin1 | | character_set_results | eucjpms | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+---------+ 6 rows in set (0.01 sec) mysql>
'abc' だけなら、アルファベットだけなので english つまり latin1 に なるのだろうか。
mysql> SELECT CHARSET('abc');
+----------------+
| CHARSET('abc') |
+----------------+
| eucjpms |
+----------------+
1 row in set (0.01 sec)
mysql>
という訳で、SET NAMES で指定した eucjmps になっている。
当然のことながら、キャラクタセット latin1 の文字列 'abc' は、
mysql> SELECT CHARSET(_latin1'abc'), _latin1'abc'; +-----------------------+-----+ | CHARSET(_latin1'abc') | abc | +-----------------------+-----+ | latin1 | abc | +-----------------------+-----+ 1 row in set (0.00 sec) mysql>
前置きが長くなってしまった。binaryとその他のキャラクタセットの 結合をCONCAT()で行ない、結果の文字列のキャラクタセットを調べてみよう。
latin1 + binary
mysql> SELECT CHARSET(CONCAT(_latin1'Latin',_binary'Binary')); +-------------------------------------------------+ | CHARSET(CONCAT(_latin1'Latin',_binary'Binary')) | +-------------------------------------------------+ | binary | +-------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(_binary'Binary',_latin1'Latin')); +-------------------------------------------------+ | CHARSET(CONCAT(_binary'Binary',_latin1'Latin')) | +-------------------------------------------------+ | binary | +-------------------------------------------------+ 1 row in set (0.00 sec) mysql>
マニュアルに書いてある通り、binaryになった。
utf8 + binary
前回、変数 @UTOKYO に utf8 の '東京' という文字列を代入しておいた。 これを使って、結合してみよう。
mysql> SELECT CHARSET(CONCAT(@UTOKYO,_binary'Binary')); +------------------------------------------+ | CHARSET(CONCAT(@UTOKYO,_binary'Binary')) | +------------------------------------------+ | utf8 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(_binary'Binary',@UTOKYO)); +------------------------------------------+ | CHARSET(CONCAT(_binary'Binary',@UTOKYO)) | +------------------------------------------+ | utf8 | +------------------------------------------+ 1 row in set (0.00 sec) mysql>
マニュアルに従うなら、binary と utf8 の結合は binary になる筈なのだが、 なぜか utf8 になってしまった。変だ!
eucjpms + binary
今度は、eucjpms で調べてみよう。
mysql> SELECT CHARSET(CONCAT(@ETOKYO,_binary'Binary')); +------------------------------------------+ | CHARSET(CONCAT(@ETOKYO,_binary'Binary')) | +------------------------------------------+ | eucjpms | +------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(_binary'Binary',@ETOKYO)); +------------------------------------------+ | CHARSET(CONCAT(_binary'Binary',@ETOKYO)) | +------------------------------------------+ | eucjpms | +------------------------------------------+ 1 row in set (0.00 sec) mysql>
結果は、binaryではなく、eucjpmsになってしまった。
cp932 + binary
今度は、cp932 で調べてみよう。
mysql> SELECT CHARSET(CONCAT(@STOKYO,_binary'Binary')); +------------------------------------------+ | CHARSET(CONCAT(@STOKYO,_binary'Binary')) | +------------------------------------------+ | cp932 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(_binary'Binary',@STOKYO)); +------------------------------------------+ | CHARSET(CONCAT(_binary'Binary',@STOKYO)) | +------------------------------------------+ | cp932 | +------------------------------------------+ 1 row in set (0.00 sec) mysql>
結果は、binaryではなく、cp932 になってしまった。
マニュアルに従えば、 キャラクタセットがbinaryの文字列が1つでも含まれていたら、 結果の文字列のキャラクタセットはbinaryになってしまうはずなのだが、 どうもそうではないような動きをしている。
CONCAT()にbinary型の文字列が含まれていても、 結果がbinaryにならないことがあるらしい???
何か間違っているかもしれない。 いつもより長く書いてしまったので、疲れて間違ったことをしたかもしれない。
でも、変だなぁ。
次へ:CONVERT()によるbinary文字列のCONCATはOK
フィードバック:
There is no comment.