Open Source WEB

まず、文字列を繋ぐ関数CONCAT()のマニュアルの説明部分を挙げておく。

12.3. String Functions

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>

正しく準備ができたようなので、実際に繋いでみるテストは次回にしよう。


戻る:mysqlのオプション指定でテーブルの縦線を揃える

次へ:キャラクタセットがbinaryの文字列のCONCATは


フィードバック:

Name:
Comment:

There is no comment.

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

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