Open Source WEB

良く考えてみると、前回は、SET NAMES で eucjpms の設定を行なう前に 関数を作ってしまっていた。一旦消して、eucjpms にしてから行なってみよう。

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

こんどは、どうなるであろうか?

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

前と情况が異なって、?が5つ並んでしまった。

実際に何が出力されているのか、16進数にする関数 HEX()で調べてみよう。

mysql> SELECT HEX(hello());
+--------------+
| HEX(hello()) |
+--------------+
| 3F3F3F3F3F   |
+--------------+
1 row in set, 1 warning (0.00 sec)

mysql>

本当の '?' のようだ。'こんにちは' の5文字が、 それぞれ '?' に変換されたというか、化けてしまったのである。

では、hello() から返ってきた文字列のキャラクタセットを調べてみよう。 そのためには、 CHARSET() という関数を使えば良かった。

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

hello()の戻り値である文字列のキャラクタセットが、 何と binary になってしまっている。

何故? ちょっとじっくり考えるしかないようだ。


戻る:日本語文字列を返すファンクションを作ってみよう

次へ:戻り値のキャラクタセットを指定せねば


フィードバック:

Name:
Comment:

There is no comment.

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

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