Open Source WEB

前回の続きで、character_set_connectionをbinaryにした場合を調べてみよう。

mysql> SET @@character_set_connection=binary;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | eucjpms |
| character_set_connection | binary  |
| character_set_database   | latin1  |
| character_set_results    | eucjpms |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.00 sec)
 
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| 漢字:B4C1BBFA:eucjpms                              |
+----------------------------------------------------+
1 row in set (0.01 sec)
 
mysql>

この場合は、正常に動いているように見える。

これは当然で、eucjpms → binary → eucjpms という変換が行なわれているからである。binaryとその他のキャラクタセットとの間の変換は、実は何も行なわないので、 データそのものは無変更で渡され、キャラクタセットの指定が変更されるに過ぎない。


パラメータのキャラクタセットを binaryに

いままでは、character_set_connection を binary にしたが、 これはcp932に戻して、パラメータのキャラクタセットを binaryにしてみよう。

mysql> SET @@character_set_connection=cp932;
Query OK, 0 rows affected (0.00 sec)
 
mysql> DROP FUNCTION parametercharset;
Query OK, 0 rows affected (0.11 sec)
 
mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) CHARACTER SET binary )
    -> RETURNS CHAR(50) CHARACTER SET binary
    -> DETERMINISTIC
    -> BEGIN
    -> SET @PR1 = s;
    -> SET @STR = CONCAT( s, ':', HEX(s), ':', CHARSET(s) );
    -> SET @CSR = CHARSET(@STR);
    -> RETURN @STR;
    -> END//
Query OK, 0 rows affected (0.01 sec)
 
mysql> DELIMITER ;
mysql>

BEGIN〜ENDの中で、パラメータで渡された文字列そのものを@PR1に保存する ように変更し、他の変数への保存は少くした。

さて、これを実行するとどうなるだろうか。

mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| Š??š                                                |
+----------------------------------------------------+
1 row in set, 1 warning (0.06 sec)
 
mysql>

変な表示になってしまった。ファンクションが受け取ったパラメータは @PR1にセーブしておいたので、それを調べてみよう。

mysql> SELECT @PR1;
+----------------------+
| @PR1                 |
+----------------------+
| Š??š                  |
+----------------------+
1 row in set (0.00 sec)
 
mysql>

文字化けしてしまったようだ。もっと詳しく、16進数にして見てみよう。

mysql> SELECT HEX(@PR1);
+------------------------------------------+
| HEX(@PR1)                                |
+------------------------------------------+
| 8ABF8E9A00000000000000000000000000000000 |
+------------------------------------------+
1 row in set (0.00 sec)
 
mysql>

'漢字'という文字列が、ちゃんとcp932に変換され、後は00になって、 全体でバイトになっているようだ。 これは、パラメータに s CHAR(20) CHARACTER SET binary と 固定長のbinary型文字列で、サイズが20としたからである。

表示がうまく行かないのは、クライアントが受け取る場合の キャラクタセットを示すcharacter_set_resultsの値が 今はeucjpmsになっているのだが、実際に返された文字列のキャラクタセットが 表面上はbinaryで、その実cp932になっているからである。

パラメータのキャラクタセットをわざわざbinaryにすることは少ないと思われるので、 このやり方のテストは止めて、次回は普通の情况に近いテストを行なおうと思う。

たとえば、サーバ側、つまりファンクションの方がutf8で、 クライアントが cp932 とかという組み合わせである。


戻る:character_set_connectionを変えたときのファンクションパラメーは


フィードバック:

Name:
Comment:

There is no comment.

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

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