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()で、eucjpms,cp932,utf8が混在した場合の文字列結合を試したが、 REPLACEでも同じことを試みてみよう。 まあ、実際にそんなことが発生するような無茶な情况が発生するようでは データベースの設計がおかしいと思うが、ここはテストの場だからよしとしよう。
テストパターンとして、'東京理科大学'の '理科' を '芸術' に置き換えることを 行なう。
mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT REPLACE('東京理科大学','理科','芸術');
+---------------------------------------+
| REPLACE('東京理科大学','理科','芸術') |
+---------------------------------------+
| 東京芸術大学 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql>
この例では、eucjpmsの環境で、文字列に何の指定もないので、 すべてがeucjpmsの文字列として処理され、なんの問題も発生しない。
以下で、様々なキャラクタセットの組み合わせで試してみる。
eucjpms + cp932
まず、'理科' だけをcp932にしてみるとどうなるだろうか?
mysql> SET @RIKA = CONVERT('理科' USING cp932);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT REPLACE('東京理科大学',@RIKA,'芸術');
+--------------------------------------+
| REPLACE('東京理科大学',@RIKA,'芸術') |
+--------------------------------------+
| 東京芸術大学 |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE('東京理科大学',@RIKA,'芸術'));
+-----------------------------------------------+
| CHARSET(REPLACE('東京理科大学',@RIKA,'芸術')) |
+-----------------------------------------------+
| cp932 |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql>
結果は、cp932の文字列になったようだ。
次に、'芸術'だけをcp932にするとどうなるだろうか。
mysql> SELECT REPLACE('東京理科大学','理科',@GEI);
+-------------------------------------+
| REPLACE('東京理科大学','理科',@GEI) |
+-------------------------------------+
| 東京芸術大学 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE('東京理科大学','理科',@GEI));
+----------------------------------------------+
| CHARSET(REPLACE('東京理科大学','理科',@GEI)) |
+----------------------------------------------+
| cp932 |
+----------------------------------------------+
1 row in set (0.00 sec)
mysql>
ということは、'理科'と'芸術'の両方をcp932にしても正常に動くのではないだろうか。
mysql> SELECT REPLACE('東京理科大学',@RIKA,@GEI);
+------------------------------------+
| REPLACE('東京理科大学',@RIKA,@GEI) |
+------------------------------------+
| 東京芸術大学 |
+------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE('東京理科大学',@RIKA,@GEI));
+---------------------------------------------+
| CHARSET(REPLACE('東京理科大学',@RIKA,@GEI)) |
+---------------------------------------------+
| cp932 |
+---------------------------------------------+
1 row in set (0.00 sec)
mysql>
CONCAT()の場合、ecujpmsとcp932の組み合わせはまったく駄目だったのだが、 REPLACE()では、結果がcp932になって、大丈夫みたいだ。
'東京理科大学'と直接書いていたが、
mysql> SET @RIKADAI = '東京理科大学'; Query OK, 0 rows affected (0.00 sec) mysql>
として、変数 @RIKADAI に一旦代入してから、REPLACE()を呼び出してみよう。 当然、REPLACE('東京理科大学',@RIKA,@GEI)と同じ結果になろう。
mysql> SELECT CHARSET(REPLACE(@RIKADAI,@RIKA,@GEI)); ERROR 1270 (HY000): Illegal mix of collations (eucjpms_japanese_ci,IMPLICIT), (cp932_japanese_ci,IMPLICIT), (cp932_japanese_ci,IMPLICIT) for operation 'replace' mysql>
しかし、エラーになってしまった。COLLATIONが違って駄目らしい。
文字列を変数に代入してから利用するのと、 直接関数のパラメータにベタ書きするのでは動きが違う。なぜ?
今まで、直接書くのが面倒な場合など、一旦変数に入れておいてから、 後で何度でも使うなんてことをやってきたのだが、 そういう風にいかないとなると困るなぁ。
戻る:REPLACE()でキャラクタセットはいつ変換されるか
フィードバック:
There is no comment.