Open Source WEB

latin1の文字列も用意しておこう。

mysql> SET @T = _latin1'Tokyo';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @T, CHARSET(@T);
+-------+-------------+
| @T    | CHARSET(@T) |
+-------+-------------+
| Tokyo | latin1      |
+-------+-------------+
1 row in set (0.00 sec)
 
mysql>

さて、前回の続きで、

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;

が実行されているものとしよう。


では、例によって、latin1 と他のキャラクタセットの組み合わせを調べていこう。

latin1 + utf8

mysql> SELECT CONCAT(@T,@UTOKYO);
+--------------------+
| CONCAT(@T,@UTOKYO) |
+--------------------+
| Tokyo東京          |
+--------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CONCAT(@T,@UTOKYO));
+-----------------------------+
| CHARSET(CONCAT(@T,@UTOKYO)) |
+-----------------------------+
| utf8                        |
+-----------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET( CONCAT(@UTOKYO,@T));
+------------------------------+
| CHARSET( CONCAT(@UTOKYO,@T)) |
+------------------------------+
| utf8                         |
+------------------------------+
1 row in set (0.00 sec)
 
mysql>

とうことで、latin1 と utf8 の組み合わせは可能で、結果は utf8 になるようだ。

latin1 + eucjpms

mysql> SELECT CONCAT(@T,@ETOKYO);
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) 
and (eucjpms_japanese_ci,IMPLICIT) for operation 'concat'
mysql> SELECT CONCAT(@ETOKYO,@T);
ERROR 1267 (HY000): Illegal mix of collations (eucjpms_japanese_ci,IMPLICIT) 
and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
mysql>

とエラーになってしまった。この組み合わせは拒否されるようだ。

latin1 + cp932

eucjpms が駄目だったのだから、当然拒否されるだろうけれど、 一応確認しておこう。

mysql> SELECT CONCAT(@T,@STOKYO);
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) 
and (cp932_japanese_ci,IMPLICIT) for operation 'concat'
mysql> SELECT CONCAT(@STOKYO,@T);
ERROR 1267 (HY000): Illegal mix of collations (cp932_japanese_ci,IMPLICIT) 
and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
mysql>

やはり、思った通りに駄目であった。

latin1 + binary

これは、当然のように binary になるであろう。

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

結論

ということで、次のようになるってことかな。

latin1 + binary    ⇒  binary
latin1 + utf8      ⇒  utf8
latin1 + eucjpms       エラー
latin1 + cp932         エラー

キャラクタセットの組み合わせには、いろいろ注意すべきことがあるようだ。

マニュアルのどこかにきちんとしたキャラクタセットの組み合わせポリシーが 書いてあるかと思って捜してみたのだが、見当たらなかった。 英語力の不足もあるので、見逃した可能性も高い。 キャラクタセットの組み合わせポリシーを御存じの方、見つけられた方は、 フィードバックをお願いします。


戻る:eucjpms,cp932,utf8三種混在のCONCATは

次へ:REPLACE()で文字列の一部を置換する


フィードバック:

Name:
Comment:

There is no comment.

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

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