Open Source WEB

前回、'こんにちは' を返すだけの単純な次のファンクションを作った。

CREATE FUNCTION hello() RETURNS VARCHAR(50)
DETERMINISTIC RETURN 'こんにちは';

しかし、このファンクションがうまく動いてくれなかった。

まず、キャラクタセットがバイナリになっていたが、これは何とかしたいものである。

オンラインマニュアル 17.2.1. CREATE PROCEDURE and CREATE FUNCTION によると、ファンクションの構文の部分は以下のようになっている。

CREATE FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

戻り値の型は、RETURNS の後に type で指定することができる。

hello() は、 RETURNS VARCHAR(50) としていたので、 VARCHAR型であるが、キャラクタセットの指定をしていなかった。

今回は、キャラクタセットをちゃんと指定して、再び試してみよう。

ファンクションの戻り値の型を、VARCHAR(50) CHARACTER SET eucjpmsとしてみる。 これは、他の場所でのキャラクタセットの指定と同じなので、 多分OKになるはずだ。

mysql> DROP FUNCTION IF EXISTS hello;
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER //
mysql> CREATE FUNCTION hello() RETURNS VARCHAR(50) CHARACTER SET eucjpms
    -> DETERMINISTIC RETURN 'こんにちは';
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;
mysql>

大丈夫だったようだ。 これで、ファンクション hello() は、 eucjpms の文字列を返すようになったに違いない。

mysql> SELECT hello();
+---------+
| hello() |
+---------+
| ?????   |
+---------+
1 row in set, 1 warning (0.04 sec)
 
mysql>

やっぱりうまく動かない。 とりあえず、ファンクションのキャラクタセットがちゃんと eucjpms に なっているかどうか確認しよう。

mysql> SELECT CHARSET(hello());
+------------------+
| CHARSET(hello()) |
+------------------+
| binary           |
+------------------+
1 row in set (0.00 sec)
 
mysql>

まだ、キャラクタセットは binary のままである。 ちゃんと指定し、ファンクションを作ったときにはエラーも出なかったのに、 これは、何かがおかしい。しっかり調べなければ。

なお、現在使っているバージョンは、

mysql> SELECT VERSION();
+---------------------+
| VERSION()           |
+---------------------+
| 5.0.18-standard-log |
+---------------------+
1 row in set (0.00 sec)
 
mysql>

である。

17.2.1. CREATE PROCEDURE and CREATE FUNCTION を読んだが、5.0.18からは、

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 を反映するはずだ。 でも、何故だか動かないのだが、今日はここまでとしよう。


戻る:日本語文字列を返すにはどうすれば良いのか

次へ:戻り値のキャラクタセットをbinaryにして誤魔化した


フィードバック:

Name:
Comment:

There is no comment.

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

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