Open Source WEB

_binary というintroducerを用いたとき、変になるのだった。

mysql> SELECT CHARSET(CONCAT(_binary'東京',@STOKYO));
+----------------------------------------+
| CHARSET(CONCAT(_binary'東京',@STOKYO)) |
+----------------------------------------+
| cp932                                  |
+----------------------------------------+
1 row in set (0.00 sec)
 
mysql> 

となってしまうのだが、_binary'東京'を一旦変数にぶちこんでから 同じことをすると、どうなるだろうか。

mysql> SET @B = _binary'東京';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT CHARSET(CONCAT(@B,@STOKYO));
+-----------------------------+
| CHARSET(CONCAT(@B,@STOKYO)) |
+-----------------------------+
| binary                      |
+-----------------------------+
1 row in set (0.00 sec)
 
mysql>

あれれ、結果がbinaryになってしまった。これは正しいではないか。

ということは、 CONCATのパラメータとして直接 _binary'文字列' を書いた場合は正しく動かず、 一旦変数に入れてしまうと大丈夫になる。

CONCAT()の中に、直接 _binary'文字列' があったとき、 結果のキャラクタセットがbinaryにならないようだ。


binary 以外をintroducerで作るとどうなるか

実は、こんな感じになってしまった。

mysql> SELECT CHARSET(CONCAT(_binary'tokyo',_cp932'tokyo'));
+-----------------------------------------------+
| CHARSET(CONCAT(_binary'tokyo',_cp932'tokyo')) |
+-----------------------------------------------+
| binary                                        |
+-----------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CONCAT(_binary'tokyo',@STOKYO));
+-----------------------------------------+
| CHARSET(CONCAT(_binary'tokyo',@STOKYO)) |
+-----------------------------------------+
| cp932                                   |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CONCAT(@BTOKYO,@STOKYO));
+----------------------------------+
| CHARSET(CONCAT(@BTOKYO,@STOKYO)) |
+----------------------------------+
| binary                           |
+----------------------------------+
1 row in set (0.00 sec)
 
mysql>

なかなか奥が深いな。

ともにintroducerで指定した場合は、結果はbinaryで正しい。

取りあえずの結論:

CONCAT()の中で、_binary を使った場合にはおかしくなるようだ。

introducerによる指定は、中味は変更せず、キャラクタセットだけを変更する、 つまり見せかけだけを変更するので、 CONVERT()のように本当に呼び出す必要もないので、 処理が非常に軽いはずなのだが、たぶん何処かで処理をミスっているらしい。

CONCAT()の中にbinaryの文字列があった場合についての迷走はこのあたりにして、 次回はCONCAT()の本来の機能の続きを旅しようと思う。


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

次へ:eucjpms,cp932,utf8混在のCONCATは


フィードバック:

Name:
Comment:

There is no comment.

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

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