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
関連リンク
今まで 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は
フィードバック:
There is no comment.