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
関連リンク
前回、'こんにちは' を返すだけの単純な次のファンクションを作った。
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にして誤魔化した
フィードバック:
There is no comment.