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
関連リンク
パラメータで渡された文字列がどういうものかを16進数にして、 出力の文字列に含めるようにしてみよう。 そうすることで、どういう文字列だったかが正確に分かるというものだ。
さて、まずは全部の環境を eucjpms に戻してから確認しよう。
mysql> SET @@character_set_database=eucjpms; Query OK, 0 rows affected (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.00 sec) mysql>
今度は、戻す文字列を作るところを、 CONCAT( s, ':', HEX(s), ':', CHARSET(s) ) にしてみよう。 つまり、
- パラメータの文字列
- 16進数表記
- パラメータのキャラクタセット
が : で繋がったものがファンクションの戻り値となる。
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 RETURN CONCAT( s, ':', HEX(s), ':', CHARSET(s) );
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> DELIMITER ;
mysql>
では、'漢字' という文字列を与えて、 それに色々なオプション(16進数表記、キャラクタセット)が加えられた 文字列がちゃんと返ってくるか確認してみよう。
mysql> SELECT HEX('漢字');
+-------------+
| HEX('漢字') |
+-------------+
| B4C1BBFA |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT parametercharset('漢字');
+----------------------------------------------------+
| parametercharset('漢字') |
+----------------------------------------------------+
| 漢字:B4C1BBFA:eucjpms |
+----------------------------------------------------+
1 row in set (0.00 sec)
mysql>
うまく行っているようだ。
ちょっとここで、現在の環境を整理しておこう。 現在は、以下の全てが、EUC-JP(eucjpms)に設定されている。
- ターミナル
- character_set_client
- character_set_connection
- パラメータのキャラクタセット
- character_set_database
- character_set_results
そして、ファンクションの戻り値だけがバグ回避のために binary になっている。 つまり、どこにも文字列データそのものに変化を及ぼす類の キャラクタセット変換が発生する個所がないので、かなり安全な情况になっている、 と思っているがどうだろう。
調べるための道具の用意ができたようなので、今日はここまでとしよう。
次へ:ファンクションの本体をBEGIN〜ENDで括ってみよう
フィードバック:
There is no comment.