mysql:12618
From: Hirofumi Fujiwara <Hirofumi Fujiwara <fuji@xxxxxxxxxx>>
Date: Wed, 04 Jan 2006 18:50:29 +0900 (JST)
Subject: [mysql 12618] Re: FUNCTIONの返す文字列型
藤原です 自己フォロー。 5.0.18 をダウンロードしてテストしてみました。 マニュアルには、PROCEDURE/FUNCTION のとき、 CHARACTER SET/COLLATION に対応してくれる様に書かれていたのですが、以下のようになってしまいまし た。 SHOW CREATE FUNCTION でどのようにCREATEされたかを調べようとしたら、 CHARACTER SETの部分は消えていました。 やっぱりまだ駄目なんでしょうか? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mysql> SELECT VERSION(); +---------------------+ | VERSION() | +---------------------+ | 5.0.18-standard-log | +---------------------+ 1 row in set (0.01 sec) mysql> SET NAMES utf8; Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER // mysql> CREATE FUNCTION tokyo() RETURNS VARCHAR(20) CHARACTER SET utf8 -> DETERMINISTIC RETURN _utf8 X'E69DB1E4BAAC'; -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> SELECT tokyo(); +---------+ | tokyo() | +---------+ | ?? | +---------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT HEX(tokyo()); +--------------+ | HEX(tokyo()) | +--------------+ | 3F3F | +--------------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT CHARSET(tokyo()); +------------------+ | CHARSET(tokyo()) | +------------------+ | binary | +------------------+ 1 row in set (0.00 sec) mysql> SHOW CREATE FUNCTION tokyo\G *************************** 1. row *************************** Function: tokyo sql_mode: Create Function: CREATE FUNCTION `tokyo`() RETURNS varchar(20) DETERMINISTIC RETURN _utf8 X'E69DB1E4BAAC' 1 row in set (0.00 sec) mysql> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - > 藤原です > > 5.0.16 を使っているときに、FUNCTIONの返す文字列型 がどうもうまく動いて > いないことを書きました。 > > 今日、 > 17.2.1. CREATE PROCEDURE and CREATE FUNCTION > http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html > > を見てみたら、 > > As of MySQL 5.0.18, the server uses the data type of a routine > parameter or function return value as follows. These rules also apply > to local routine variables created with the DECLARE statement > (Section 17.2.9.1, “DECLARE Local Variables”). > > * > > Assignments are checked for data type mismatches and > overflow. Conversion and overflow problems result in warnings, > or errors in strict mode. > * > > 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.) > * > > Only scalar values can be assigned to parameters or > variables. For example, a statement such as SET x = (SELECT 1, > 2) is invalid. > > Before MySQL 5.0.18, parameters, return values, and local variables > are treated as items in expressions, and are subject to automatic > (silent) conversion and truncation. Stored functions ignore the > sql_mode setting. > > という記述がいつの間にか挿入されていました。 > もしかすると、 5.0.18(日本時間12/31リリース)で対応したってことですかね。 > > 早速、5.0.18 をダウンロードして再確認するしかないみたいですね。 > もう誰か確認された方いらっしゃいますか? > > > 藤原です > > > > MySQL5.0.16 を使用しておりますが、FUNCTIONで日本語の文字列を返そうと > > 思っているのですが、CHARACTER SET の指定が有効になりません。 > > > > > > 文字列 'こんにちは' を返す関数作ったら、以下のように動いたのですが、 > > CHARSETで文字列のCHARSETを調べたら、binaryでした。 > > > > mysql> CREATE FUNCTION hello () RETURNS CHAR(50) > > -> RETURN 'こんにちは'; > > Query OK, 0 rows affected (0.02 sec) > > > > mysql> SELECT hello(); > > +------------+ > > | hello() | > > +------------+ > > | こんにちは | > > +------------+ > > 1 row in set (0.00 sec) > > > > mysql> SELECT CHARSET(hello()); > > +------------------+ > > | CHARSET(hello()) | > > +------------------+ > > | binary | > > +------------------+ > > 1 row in set (0.00 sec) > > > > mysql> > > > > mysql> CREATE FUNCTION hello () RETURNS CHAR(50) CHARACTER SET eucjpms > > -> RETURN 'こんにちは'; > > Query OK, 0 rows affected (0.00 sec) > > > > mysql> SELECT CHARSET(hello()); > > +------------------+ > > | CHARSET(hello()) | > > +------------------+ > > | binary | > > +------------------+ > > 1 row in set (0.01 sec) > > > > mysql> > > > > ということで、eucjpmsの指定はエラーにならず受け付けられるのですが、 > > 呼び出してキャラクタセットを見ると、やはり binary になってしまいます。 > > > > ちゃんとしたキャラクタセットを指定する方法はあるのでしょうか? > > > ------------------------------------------------------------------ > 株式会社 タイムインターメディア 藤原 博文 fuji@xxxxxxxxxx > 本社 160-0002 東京都新宿区坂町26-27 IPBビル TEL 03-5362-9009 > URL http://www.timedia.co.jp/ FAX 03-5362-9008 > 地図 http://www.timedia.co.jp/company/map/ 新宿線曙橋駅徒歩5分 > ------------------------------------------------------------------ > オープンソースWEB http://oss.timedia.co.jp/ 「MySQL日本語の旅」 > ------------------------------------------------------------------
12593 2005-12-18 21:10 [Hirofumi Fujiwara <f] FUNCTIONの返す文字列型 12617 2006-01-04 16:05 ┗[Hirofumi Fujiwara <f] -> 12618 2006-01-04 18:50 ┗[Hirofumi Fujiwara <f] 12629 2006-01-10 22:03 ┗[Hirofumi Fujiwara <f]