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
関連リンク
文字列操作関数は色々あるのだが、今回は REPLACE()を考えてみよう。 例によって、マニュアルのREPLACE()の説明を挙げておく。
REPLACE(str,from_str,to_str)
Returns the string str with all occurrences of the string from_str
replaced by the string to_str. REPLACE() performs a case-sensitive
match when searching for from_str.
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
This function is multi-byte safe.
REPLACE(str,from_str,to_str)は3つの文字列引数をとるのだが、 どういう動きになるかは、実際の例で示した方が分かりやすいだろう。
mysql> SELECT REPLACE('東京なんとか大学','なんとか','女子医科');
+---------------------------------------------------+
| REPLACE('東京なんとか大学','なんとか','女子医科') |
+---------------------------------------------------+
| 東京女子医科大学 |
+---------------------------------------------------+
1 row in set (0.00 sec)
mysql>
今は、 SET NAMES eucjpms の状態になっているので、 与えた文字列のキャラクタセットは全部 eucjpms になり、 結果も
mysql> SELECT CHARSET(REPLACE('東京なんとか大学','なんとか','女子医科'));
+------------------------------------------------------------+
| CHARSET(REPLACE('東京なんとか大学','なんとか','女子医科')) |
+------------------------------------------------------------+
| eucjpms |
+------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
と、めでたく eucjpms になっている。
binary を含んでいた場合
さて、1つでもbinaryになっていたら、結果はどうなるのであろうか。
まず、eucjpms と binary が混じっていた場合を試してみる。
mysql> SELECT REPLACE(_binary'東京なんとか大学','なんとか','女子医科');
+----------------------------------------------------------+
| REPLACE(_binary'東京なんとか大学','なんとか','女子医科') |
+----------------------------------------------------------+
| 東京女子医科大学 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE(_binary'東京なんとか大学','なんとか','女子医科'));
+-------------------------------------------------------------------+
| CHARSET(REPLACE(_binary'東京なんとか大学','なんとか','女子医科')) |
+-------------------------------------------------------------------+
| binary |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT REPLACE('東京なんとか大学',_binary'なんとか','女子医科');
+----------------------------------------------------------+
| REPLACE('東京なんとか大学',_binary'なんとか','女子医科') |
+----------------------------------------------------------+
| 東京女子医科大学 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE('東京なんとか大学',_binary'なんとか','女子医科'));
+-------------------------------------------------------------------+
| CHARSET(REPLACE('東京なんとか大学',_binary'なんとか','女子医科')) |
+-------------------------------------------------------------------+
| binary |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT REPLACE('東京なんとか大学','なんとか',_binary'女子医科');
+----------------------------------------------------------+
| REPLACE('東京なんとか大学','なんとか',_binary'女子医科') |
+----------------------------------------------------------+
| 東京女子医科大学 |
+----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CHARSET(REPLACE('東京なんとか大学','なんとか',_binary'女子医科'));
+-------------------------------------------------------------------+
| CHARSET(REPLACE('東京なんとか大学','なんとか',_binary'女子医科')) |
+-------------------------------------------------------------------+
| binary |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
要するに、1つでもbinaryになっていたら、最終的な結果もbinaryになるようだ。
次に、cp932 や utf8 と binary が混じっていた場合はまだ試していないが、
REPLACE()の3つのパラメータ文字列の1つでもbinary文字列だったら、 結果はbinaryになる
と考えられそうだ。マニュアルには何の説明もなかったが、たぶんそうだろう。 そして、これは、CONCAT()のときと同じ方針と考えてよいだろう。
次へ:キャラクタセットがbinaryの文字列のREPLACEは
フィードバック:
There is no comment.