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()のマニュアルの説明部分を挙げておく。
CONCAT(str1,str2,...)
Returns the string that results from concatenating the arguments.
May have one or more arguments. If all arguments are non-binary
strings, the result is a non-binary string. If the arguments include
any binary strings, the result is a binary string. A numeric argument
is converted to its equivalent binary string form; if you want to
avoid that, you can use an explicit type cast, as in this example:
SELECT CONCAT(CAST(int_col AS CHAR), char_col);
CONCAT() returns NULL if any argument is NULL.
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
要するに、CONCAT(str1,str2,...) という具合に、 繋げたい文字列をカンマで区切って並べればOKということだ。
ただし、いくつかの条件などがある。
- NULLが1つでも含まれている場合は、結果もNULLになる。
- binaryが1つでも含まれている場合は、結果はbinaryになる。
- 数値があたえられると、binaryの文字列に変換され、処理される。
- binaryでない文字列が結合されると、結果もbinaryでない文字列になる。
とあるのだが、明確なようでちっとも明確でない。
日本語を扱う場合に問題になるのは、異なるキャラクタセットの文字列を つい結合してしまうことがあるのだが、そのときどういうことになるかを確認しよう。
色々なキャラクタセットの文字列
テストの準備として、色々なキャラクタセットの文字列を変数で用意しよう。
mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @ETOKYO='東京';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @STOKYO=CONVERT(@ETOKYO USING cp932);
Query OK, 0 rows affected (0.03 sec)
mysql> SET @UTOKYO=CONVERT(@ETOKYO USING utf8);
Query OK, 0 rows affected (0.00 sec)
mysql> SET @BTOKYO=CONVERT(@ETOKYO USING binary);
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> SELECT @ETOKYO, @STOKYO, @UTOKYO, @BTOKYO;
+---------+---------+---------+---------+
| @ETOKYO | @STOKYO | @UTOKYO | @BTOKYO |
+---------+---------+---------+---------+
| 東京 | 東京 | 東京 | 東京 |
+---------+---------+---------+---------+
1 row in set (0.00 sec)
mysql>
どのキャラクタセットになっていても、 キャラクタセットの自動変換が行なわれるため、 SELECT @ETOKYO, @STOKYO, @UTOKYO, @BTOKYO; で表示したとき、 どのキャラクタセットでもちゃんと表示されるのである。
さて、それぞれ、CONVERT()を使ってキャラクタセット変換を行なったのだが、 それぞれの変数に、希望のキャラクタセットの文字列が入っているか確認しよう。
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>
正しく準備ができたようなので、実際に繋いでみるテストは次回にしよう。
次へ:キャラクタセットがbinaryの文字列のCONCATは
フィードバック:
There is no comment.