Open Source WEB

CONCAT()において、パラメータ(結合する文字列の並び)の中に 一つでもキャラクタセットがbinaryのものがあると、 結果はbinaryになるとマニュアルにあったのだが、 そうならない事が前回発覚したのであった。

どのキャラクタセットでも現象は同じらしいので、 ここでは、utf8 の例だけを再掲しておく。

mysql> SELECT CHARSET(@UTOKYO), CHARSET(_binary'Binary');
+------------------+--------------------------+
| CHARSET(@UTOKYO) | CHARSET(_binary'Binary') |
+------------------+--------------------------+
| utf8             | binary                   |
+------------------+--------------------------+
1 row in set (0.01 sec)
 
mysql> SELECT CHARSET(CONCAT(@UTOKYO,_binary'Binary'));
+------------------------------------------+
| CHARSET(CONCAT(@UTOKYO,_binary'Binary')) |
+------------------------------------------+
| utf8                                     |
+------------------------------------------+
1 row in set (0.00 sec)
 
mysql>

さて、ここで、binary 文字列を作るのに、 _binary を用いている。

ところで、あるキャラクタセットの文字列をbinaryにする方法は何が あったであろうか。

_binary '文字列'

CONVERT( '文字列' USING binary )

CONVERTを使った作ったbinary文字列に対して、試してみよう。

実は、@BTOKYO には、以下のように CONVERTを使って作った binaryの 文字列が入っているのであった。

mysql> SET @BTOKYO=CONVERT(@ETOKYO USING binary);
Query OK, 0 rows affected (0.00 sec)

さて、これを使って、色々試してみよう。

mysql> SELECT CHARSET(CONCAT(@BTOKYO,@UTOKYO)),
    ->        CHARSET(CONCAT(@UTOKYO,@BTOKYO));
+----------------------------------+----------------------------------+
| CHARSET(CONCAT(@BTOKYO,@UTOKYO)) | CHARSET(CONCAT(@UTOKYO,@BTOKYO)) |
+----------------------------------+----------------------------------+
| binary                           | binary                           |
+----------------------------------+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CHARSET(CONCAT(@BTOKYO,@ETOKYO)),
    ->        CHARSET(CONCAT(@ETOKYO,@BTOKYO));
+----------------------------------+----------------------------------+
| CHARSET(CONCAT(@BTOKYO,@ETOKYO)) | CHARSET(CONCAT(@ETOKYO,@BTOKYO)) |
+----------------------------------+----------------------------------+
| binary                           | binary                           |
+----------------------------------+----------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CONCAT(@BTOKYO,@STOKYO)),
    ->        CHARSET(CONCAT(@STOKYO,@BTOKYO));
+----------------------------------+----------------------------------+
| CHARSET(CONCAT(@BTOKYO,@STOKYO)) | CHARSET(CONCAT(@STOKYO,@BTOKYO)) |
+----------------------------------+----------------------------------+
| binary                           | binary                           |
+----------------------------------+----------------------------------+
1 row in set (0.00 sec)
 
mysql>

ということで、utf8, eucjpms, cp932 のいずれも、 CONVERT()でbinaryに変換した文字列との結合をおこなうと、 マニュアル通りに、結果の文字列は binary になった。

ということは、普通の文字列にもintroducerを付加できるの最後で説明した、 _binaryというintroducer に問題があるようだ。

mysql> SET @BINARY = _binary'東京';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @BTOKYO, @BINARY;
+---------+---------+
| @BTOKYO | @BINARY |
+---------+---------+
| 東京    | 東京    |
+---------+---------+
1 row in set (0.00 sec)
 
mysql> SELECT HEX(@BTOKYO), HEX(@BINARY);
+--------------+--------------+
| HEX(@BTOKYO) | HEX(@BINARY) |
+--------------+--------------+
| C5ECB5FE     | C5ECB5FE     |
+--------------+--------------+
1 row in set (0.03 sec)
 
mysql> SELECT CHARSET(@BTOKYO), CHARSET(@BINARY);
+------------------+------------------+
| CHARSET(@BTOKYO) | CHARSET(@BINARY) |
+------------------+------------------+
| binary           | binary           |
+------------------+------------------+
1 row in set (0.00 sec)
 
mysql> SELECT COLLATION(@BTOKYO), COLLATION(@BINARY);
+--------------------+--------------------+
| COLLATION(@BTOKYO) | COLLATION(@BINARY) |
+--------------------+--------------------+
| binary             | binary             |
+--------------------+--------------------+
1 row in set (0.00 sec)
 
mysql>

いずれも、HEXによる中味確認でも一致し、キャラクタセットのみならず、 コレーションも同じである。だから、同じ物と考えて構わないように 思うのだが、良く分からないので、今日はここまでとしよう。


戻る:キャラクタセットがbinaryの文字列のCONCATは

次へ:_binaryによるbinary文字列のCONCATが変だ


フィードバック:

Name:
Comment:

There is no comment.

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

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