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( s, ':', HEX(s), ':', CHARSET(s) ) という処理で 戻り値の文字列をでっちあげ、その後この文字列を RETURN CHARACTER SET binary ということで無理矢理binaryにして戻していた。 さて、CONCATした直後の文字列のキャラクタセットは何になっているのだろうか。
いままで、ファンクションの中の処理は、RETURN の直後に直接書かれていたが、 これでは複雑な処理ができないので、 BEGIN〜END で本体を囲む構文を用いることにする。
手始めに、今までの parametercharset の本体部分を BEGIN〜END で囲ったものを 作って、動作確認しておこう。
mysql> drop function parametercharset;
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) CHARACTER SET eucjpms )
-> RETURNS CHAR(50) CHARACTER SET binary
-> DETERMINISTIC
-> BEGIN
-> RETURN CONCAT( s, ':', HEX(s), ':', CHARSET(s) );
-> END//
Query OK, 0 rows affected (0.05 sec)
mysql> DELIMITER ;
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字') |
+----------------------------------------------------+
| 漢字:B4C1BBFA:eucjpms |
+----------------------------------------------------+
1 row in set (0.04 sec)
mysql>
とくに問題なく動作しているようだ。
RETURN する前で色々調べてみることにしよう。 まず、CONCAT している各要素のキャラクタセットを求めておこう。 いちいち CONCAT して戻り値となる文字列の中に埋めこむのも面倒なので、 SELECT で直接情况をみてみることにしよう。
mysql> DROP FUNCTION parametercharset;
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) CHARACTER SET eucjpms )
-> RETURNS CHAR(50) CHARACTER SET binary
-> DETERMINISTIC
-> BEGIN
-> SELECT CHARSET(s), CHARSET(HEX(s)), CHARSET(CHARSET(s));
-> RETURN CONCAT( s, ':', HEX(s), ':', CHARSET(s) );
-> END//
ERROR 1415 (0A000): Not allowed to return a result set from a function
mysql> DELIMITER ;
mysql>
エラーが出てしまった。 result set をファンクション中で戻すと解釈されてしまったようだ。 プロシージャなら出来るはずなんだが、 ファンクションとはそういうもののようである。
ということで、SELECT文を使って、キャラクタセットを返すのは駄目なようなので、 別の手を考えよう。
別の手として、変数にぶちこんで、後から見ることをやってみよう。
アイデアが思い浮かんだところで、今日は終りにしよう。
フィードバック:
There is no comment.