Open Source WEB

今まで binary型のキャラクタセットに関して色々調べたが、 今度は、binary型でない異なるキャラクタセットが混じった場合に どんなことが発生するか調べてみよう。

さて、CONCAT()で文字列をつなぐで準備した 様々なキャラクタセットの文字列'東京'を再び使うことにしよう。

mysql> SELECT CHARSET(@ETOKYO),CHARSET(@STOKYO),CHARSET(@UTOKYO),CHARSET(@BTOKYO);
+------------------+------------------+------------------+------------------+
| CHARSET(@ETOKYO) | CHARSET(@STOKYO) | CHARSET(@UTOKYO) | CHARSET(@BTOKYO) |
+------------------+------------------+------------------+------------------+
| eucjpms          | cp932            | utf8             | binary           |
+------------------+------------------+------------------+------------------+
1 row in set (0.00 sec)
 
mysql>

では、eucjpms, cp932, utf8 の結合を試していこう。

eucjpms + cp932

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

この組み合わせでは、Illegal mix of collationsとなって、 不可能なキャラクタセットの組み合わせとなるようだ。

eucjpms + utf8

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

なんだか、この組み合わせはエラーにならないようだ。

結果のキャラクタセットは何になっているのだろうか。

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

順番を逆にしたのも確認しておこう。

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

どうも、eucjpmsとutf8の組み合わせは可能で、その結果はutf8になるようだ。 キャラクタセット変換も勝手に自動で行なわれてしまうようだ。

マニュアルとは動きが違うと言うか書いていないのだが、 utf8 は binaryと同様に特殊な動きをすると考えた方がよいのだろうか。

cp932 + utf8

このぶんだと、これもきっとできてしまうのではないだろうか。

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

なんだかよく分からないが、分かった範囲でまとめると次のようになるようだ。

CONCAT()による文字列結合

eucjpms + cp932, cp932 + eucjpms --> エラー

eucjpms + utf8, utf8 + eucjpms --> utf8

cp932 + utf8, utf8 + cp932 --> utf8

キャラクタセットの自動変換も行なわれる

ということなんだが、もっと奥が深そうな気がしないでもない。


戻る:_binaryによるbinary文字列のCONCATが変だ

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


フィードバック:

Name:
Comment:

There is no comment.

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

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