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()において、パラメータ(結合する文字列の並び)の中に 一つでもキャラクタセットが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が変だ
フィードバック:
There is no comment.