Open Source WEB

前回、ファンクションのパラメータに文字列を与えて、 無理矢理ではあるが動くようになった。

ところで、ファンクションhello() は以下のようにして作ったのであった。

CREATE FUNCTION hello (s CHAR(20))
RETURNS CHAR(50) CHARACTER SET binary
DETERMINISTIC RETURN CONCAT('Hello, ',s,'!');
//

パラメータの部分だけを取りだすと、

s CHAR(20)

であり、キャラクタセットが全然指定していない。

ここで、以上の問題を調べるために、 キャラクタセットを指定していない文字列パラメータのキャラクタセット を調べるファンクション parametercharset() を作ってみよう。

parametercharset( '文字列' )

戻り値:パラメータで与えられた文字列と、そのキャラクタセットを文字列で戻す。

mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) )
    -> RETURNS CHAR(50) CHARACTER SET binary
    -> DETERMINISTIC RETURN CONCAT( s, ':', CHARSET(s) );
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;

文字列のキャラクタセットを文字列で返す CHARSET() を呼び出しているだけである。

では、実行してみよう。

mysql> SELECT parametercharset('hello');
+----------------------------------------------------+
| parametercharset('hello')                          |
+----------------------------------------------------+
| hello:latin1                                       |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| 漢字:latin1                                        |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>

パラメータには、s CHAR(20) としか書いていないので、 デフォルトのキャラクタセットになるはずであるが、 マニュアル 17.2.1. CREATE PROCEDUREによると

For character data types, if there is a CHARACTER SET clause 
in the declaration, the specified character set and its default 
collation are used. If there is no such clause, the database 
character set and collation are used. (These are given by the 
values of the character_set_database and collation_database 
system variables.)

となっている。つまり、システム変数 character_set_database の値が 反映されるとある。

mysql> SELECT @@character_set_database;
+--------------------------+
| @@character_set_database |
+--------------------------+
| latin1                   |
+--------------------------+
1 row in set (0.00 sec)
 
mysql>

となっているので、'漢字'という文字列を与えたにもかかわらず、 システム変数 character_set_databas の値である latin1 になってしまったようである。

character_set_databas を eucjpms に変更してから、 再び実行してみよう。

mysql> SET @@character_set_database = eucjpms;
Query OK, 0 rows affected (0.05 sec)
 
mysql> SELECT @@character_set_database;
+--------------------------+
| @@character_set_database |
+--------------------------+
| eucjpms                  |
+--------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| 漢字:latin1                                        |
+----------------------------------------------------+
1 row in set (0.02 sec)
 
mysql>

どうも、character_set_database の値は利用されていないようだ。

待てよ、ファンクションを作った後で、character_set_database を eucjpms に変更したので、これではファンクションに反映されないのかもしれないなぁ。

ということで、ここで再びファンクションを作りなおして再確認してみよう。

mysql> DROP FUNCTION parametercharset;
Query OK, 0 rows affected (0.01 sec)
 
mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) )
    -> RETURNS CHAR(50) CHARACTER SET binary
    -> DETERMINISTIC RETURN CONCAT( s, ':', CHARSET(s) );
    -> //
Query OK, 0 rows affected (0.01 sec)
 
mysql> DELIMITER ;
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| 漢字:latin1                                        |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
mysql>

やっぱり駄目だ。 character_set_database の値は、ファンクションの文字列型の デフォルトキャラクタセットには反映されないようだ。

なぜ?

MySQLのバグデータベースの中の http://bugs.mysql.com/bug.php?id=16676 にこの件が書かれていて、 バグであると書かれていたので、一件落着というか、早く直してよ。


戻る:文字列パラメータを与えてみよう

次へ:文字列パラメータのキャラクタセットを指定してみよう


フィードバック:

Name:
Comment:

There is no comment.

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

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