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()のパラメータの数にはとくに制限が無いようなので、 今回は3個の場合を確かめよう。 とくに、eucjpms, cp932, utf8 の3種類が混じっているような場合を調べよう。
まあ、そんなとんでもないことは 普通には起きないと思うが、興味が沸くではないか。
さて、毎回ちまちまと変数を設定したりするのは面倒なので、 文字列'東京'の文字列4種類のキャラクタセットをもつ変数を作ってしまう tokyo-chars.sql というスクリプトを用意した。 (少しは賢くやんなくっちゃ)
$ cat tokyo-chars.sql SET NAMES eucjpms; SET @ETOKYO='東京'; SET @STOKYO=CONVERT(@ETOKYO USING cp932); SET @UTOKYO=CONVERT(@ETOKYO USING utf8); SET @BTOKYO=CONVERT(@ETOKYO USING binary); SELECT @ETOKYO, @STOKYO, @UTOKYO, @BTOKYO; $
これで、mysqlの \. コマンドで一発で実行できる筈である。
mysql> \. tokyo-chars.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.02 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) +---------+---------+---------+---------+ | @ETOKYO | @STOKYO | @UTOKYO | @BTOKYO | +---------+---------+---------+---------+ | 東京 | 東京 | 東京 | 東京 | +---------+---------+---------+---------+ 1 row in set (0.00 sec) mysql>
では、3種類の結合を色々やってみよう。
mysql> SELECT CONCAT(@ETOKYO,@UTOKYO,@STOKYO); +---------------------------------+ | CONCAT(@ETOKYO,@UTOKYO,@STOKYO) | +---------------------------------+ | 東京東京東京 | +---------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(@ETOKYO,@UTOKYO,@STOKYO)); +------------------------------------------+ | CHARSET(CONCAT(@ETOKYO,@UTOKYO,@STOKYO)) | +------------------------------------------+ | utf8 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CONCAT(@UTOKYO,@ETOKYO,@STOKYO); +---------------------------------+ | CONCAT(@UTOKYO,@ETOKYO,@STOKYO) | +---------------------------------+ | 東京東京東京 | +---------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO)); +------------------------------------------+ | CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO)) | +------------------------------------------+ | utf8 | +------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO,@ETOKYO)); +--------------------------------------------------+ | CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO,@ETOKYO)) | +--------------------------------------------------+ | utf8 | +--------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO,@ETOKYO,@STOKYO)); +----------------------------------------------------------+ | CHARSET(CONCAT(@UTOKYO,@ETOKYO,@STOKYO,@ETOKYO,@STOKYO)) | +----------------------------------------------------------+ | utf8 | +----------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
どうも、utf8が1つでも含まれていると、結果もutf8になるようだ。
しかし、
mysql> SELECT CONCAT(@ETOKYO,@STOKYO,@UTOKYO); ERROR 1270 (HY000): Illegal mix of collations (eucjpms_japanese_ci, IMPLICIT), (cp932_japanese_ci,IMPLICIT), (utf8_general_ci,IMPLICIT) for operation 'concat' mysql> SELECT CONCAT(@STOKYO,@ETOKYO,@UTOKYO); ERROR 1270 (HY000): Illegal mix of collations (cp932_japanese_ci, IMPLICIT), (eucjpms_japanese_ci,IMPLICIT), (utf8_general_ci,IMPLICIT) for operation 'concat' mysql>
となり、最初に eucjpms と cp932 が並んであった場合はエラーが 発生するようだ。
CONCAT()は、パラメータを左優先で結合していくようである。
つまり、
CONCAT(@UTOKYO,@ETOKYO,@STOKYO)
↓
CONCAT(CONCAT(@UTOKYO,@ETOKYO),@STOKYO)
という結合法則が働くらしい。 そして、結果のキャラクタセットもこれで決まっていくようだ。
めでたし、めでたし、と言えるかなぁ。ちょっと疑問もあるが。
戻る:eucjpms,cp932,utf8混在のCONCATは
フィードバック:
There is no comment.