Open Source WEB

今までは、パラメータ(引数)の無いファンクションを調べてきた。 ここで、パラメータとして文字列を与えることを考えてみよう。

実は、ファンクションを作ってみよう で、既に以下のようにパラメータのある関数をマニュアルより借用して作っていた。

mysql> DROP FUNCTION IF EXISTS hello;
Query OK, 0 rows affected, 1 warning (0.03 sec)
 
mysql> DELIMITER //
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
    -> DETERMINISTIC RETURN CONCAT('Hello, ',s,'!');
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;
mysql> SELECT hello('Asakusa');
+------------------+
| hello('Asakusa') |
+------------------+
| Hello, Asakusa!  |
+------------------+
1 row in set (0.00 sec)
 
mysql>

しかし、これは引数にアルファベットしか与えていないので、良くない。

まずは、hello に漢字の文字列を与えてみよう。

mysql> SELECT hello('漢字');
+-------------------+
| hello('漢字')     |
+-------------------+
| Hello, ´ ? ! |
+-------------------+
1 row in set (0.04 sec)
 
mysql>

今は、eucjpms にしてあるのだが、予定通りうまく行かない。

戻り値のキャラクタセットをbinaryにして誤魔化したで、 現在のファンクションは、文字列を戻すとき、そのキャラクタセットは binaryにしておかないと駄目らしいことを発見したので、 その点を修正してみよう。

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

パラメータで渡した漢字文字列を含む文字列が、 文字化けもせず(無理矢理の部分もあるが)戻って来た。

色々まだ調べることはありそうだが、 なんとなく日本語文字列を扱うことができるような気分になってきた。


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

次へ:文字列パラメータのキャラクタセットは何になっているか


フィードバック:

Name:
Comment:

There is no comment.

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

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