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
関連リンク
今までは、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にしてみよう
フィードバック:
There is no comment.