Open Source WEB

前回、マニュアル中の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にならないことがあるらしい???

何か間違っているかもしれない。 いつもより長く書いてしまったので、疲れて間違ったことをしたかもしれない。

でも、変だなぁ。


戻る:CONCAT()で文字列をつなぐ

次へ:CONVERT()によるbinary文字列のCONCATはOK


フィードバック:

Name:
Comment:

There is no comment.

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

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