Open Source WEB

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()でキャラクタセットはいつ変換されるか

次へ:mysql.ccのテーブル表示部分を読んでみよう


フィードバック:

Name:
Comment:

There is no comment.

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

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