Open Source WEB

前回の最後に書いたアイデアに従って作ったのが以下のファンクションである。

mysql> DROP FUNCTION parametercharset;
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER //
mysql> CREATE FUNCTION parametercharset( s CHAR(20) CHARACTER SET eucjpms )
    -> RETURNS CHAR(50) CHARACTER SET binary
    -> 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//
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;
mysql>

CONCATで3つの文字列を、間に ':' を挟みながら繋いでいるのだが、 その3つの文字列のキャラクタセットを @CSS、@CSH、@CSC の3変数に入れ、 CONCATした結果のキャラクタセットを @CSR に入れるようにした。

では、実際に漢字の文字列をパラメータに与えて呼び出してみよう。

mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字')                           |
+----------------------------------------------------+
| 漢字:B4C1BBFA:eucjpms                              |
+----------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT @CSS,@CSH,@CSC,@CSR;
+---------+---------+------+---------+
| @CSS    | @CSH    | @CSC | @CSR    |
+---------+---------+------+---------+
| eucjpms | eucjpms | utf8 | eucjpms |
+---------+---------+------+---------+
1 row in set (0.00 sec)
 
mysql>

プログラムの方はうまく動いたようだ。 しかし、このCONCATは、eucjpmsとutf8の2つのキャラクタセットの文字列を 繋いで、結果はeucjpmsの文字列にしているようだ。

':'の部分を除くと、各パラメータのキャラクタセットは

eucjpms + eucjpms + utf8 → eucjpms

のようになって、結果のキャラクタセットはeucjmpsになっていた。 この連載で CONCAT についてまだ書いていなかった事が分かったので、 そのうち「文字列処理」に追加しようと思う。

@CSCがutf8 ということは、CHARSET()というファンクションは、 パラメータで与えられる文字列のキャラクタセットを文字列で返すのであるが、 そのファンクションの値(戻り値)の文字列のキャラクタセットは常にutf8のようだ。

以下に、CHARSETを単独で呼び出して、 そのキャラクタセットをCHARSETで調べてみよう。 文章で書くと面倒なのだが、実行例を見ればすぐ分かるだろう。

mysql> SELECT CHARSET('漢字');
+-----------------+
| CHARSET('漢字') |
+-----------------+
| eucjpms         |
+-----------------+
1 row in set (0.00 sec)
 
mysql> SELECT CHARSET(CHARSET('漢字'));
+--------------------------+
| CHARSET(CHARSET('漢字')) |
+--------------------------+
| utf8                     |
+--------------------------+
1 row in set (0.00 sec)
 
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | eucjpms |
| character_set_connection | eucjpms |
| character_set_database   | eucjpms |
| character_set_results    | eucjpms |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.01 sec)
 
mysql>

キャラクタセット関係の変数の情况によらず、 CHARSET()の戻り値のキャラクタセットは、 utf8 のようだ。

ところで、元々は何をしようとしていたのだっけ。 今は、キャラクタセットが基本的に eucjpms で統一されているのだが、 例えば、クライアントが cp932で、サーバーが eucjpms の様なとき、 ちゃんと動くかどうかを調べることであった。

思い出せたので、今日はここまでとし、次回からそのあたりを じっくりと堀り進むことにしよう。


戻る:ファンクションの本体をBEGIN〜ENDで括ってみよう

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


フィードバック:

Name:
Comment:

There is no comment.

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

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