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
関連リンク
前回の最後に書いたアイデアに従って作ったのが以下のファンクションである。
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を変えたときのファンクションパラメーは
フィードバック:
There is no comment.