Open Source WEB

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は

次へ:latin1キャラクタセット文字列とのCONCATは


フィードバック:

Name:
Comment:

There is no comment.

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

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