Open Source WEB

今までは、SET NAMES eucjpms とした状態でテストをしてきた。 これだと、eucjpmsの世界だけで閉じているので、当然問題は起こらない。

そこで、サーバの受取側のキャラクタセットを保持しているシステム変数 character_set_connection の値を cp932 に変更して動作テストしてみよう。

mysql> SET @@character_set_connection=cp932;
Query OK, 0 rows affected (0.04 sec)
 
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | eucjpms |
| character_set_connection | cp932   |
| character_set_database   | latin1  |
| character_set_results    | eucjpms |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.00 sec)
 
mysql>

これで実行すると、

mysql>  SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| ::eucjpms                                          |
+----------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
 
mysql>

となってしまい、パラメータで何も渡されていないような動きになってしまう。

どういう関数だったかを、SHOW CREATE FUNCTIONで示しておく。

mysql> SHOW CREATE FUNCTION parametercharset\G
*************************** 1. row ***************************
       Function: parametercharset
       sql_mode:
Create Function: CREATE FUNCTION `parametercharset`( s CHAR(20) CHARACTER SET eucjpms ) RETURNS binary(50)
    DETERMINISTIC
BEGIN
  SET @CSS = CHARSET(s);
  SET @CSH = CHARSET(HEX(s));
  SET @CSC = CHARSET(CHARSET(s));
  SET @STR = CONCAT( s, ':', HEX(s), ':', CHARSET(s) );
  SET @CSR = CHARSET(@STR);
  RETURN @STR;
END
1 row in set (0.00 sec)
 
mysql>

うまく動いてくれなかったのだが、なぜ引数として与えた文字列'漢字'が ヌル文字列になってしまったのか考えてみよう。

まず、変数をみてみよう。

mysql> SELECT @CSS;
+---------+
| @CSS    |
+---------+
| eucjpms |
+---------+
1 row in set (0.00 sec)
 
mysql>

となっているので、ファンクションがパラメータとして受け取った 文字列は、確かにeucjpmsであったのだが、どうも長さは0になっていたようだ。

今回、キャラクタセットを変更したので、その点について整理しておこう。

クライアント  character_set_client    eucjpms

  ↓  eucjpms→cp932が正常に変換された。(自動変換)

サーバ     character_set_connection  cp932

  ↓  cp932→eucjpmsは変換されず、長さ0の文字列になった。

パラメータ   CHARACTER SET eucjpms

どうも、character_set_connection の指定とファンクション(およびプロシージャ) のパラメータのキャラクタセットは、一致していないと駄目ではないかと思われる。

character_set_connection と パラメータのキャラクタセットは一致すること

一致していなくても、そのままスルーで通してしまうbinaryという 何もしないキャラクタセットがあったので、次回はそれにした場合を調べてみよう。


戻る:ファンクションの本体中での情况を覗き見るには

次へ:文字列パラメータのキャラクタセットをbinaryにしてみよう


フィードバック:

Name:
Comment:

There is no comment.

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

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