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
関連リンク
気を取り直して、前回の続きをやってみよう。
サーバ側(ujis) - - - - クライアント側(sjis)
端末の文字コードを Shift-JIS にしてある。
mysql> SET NAMES sjis; Query OK, 0 rows affected (0.00 sec) mysql> SET character_set_connection=ujis; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | sjis | | character_set_connection | ujis | | character_set_database | latin1 | | character_set_results | sjis | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.00 sec)
さて、'\\'が \ となってしまったのであったから、 今度は '\' を試してみよう。
mysql> SELECT '\'; +----+ | \ | +----+ | \ | +----+ 1 row in set (0.00 sec)
次は、HEX()を使ってみよう。
mysql> SELECT HEX('\');
+-----------+
| HEX('\') |
+-----------+
| 5C |
+-----------+
1 row in set (0.00 sec)
全角の\が5Cになっている。つまり、サーバに渡って関数HEX()の引数 として与えられた文字列は、全角ではなく、半角、1バイトの5Cであったのだ。
ということは、この状態だと、全角の\も半角の\も同じエスケープ文字として 利用できそうだ。
mysql> SELECT '\\', '\\', HEX('\\'), HEX('\\');
+----+------+-------------+-------------+
| \ | \\ | HEX('\\') | HEX('\\') |
+----+------+-------------+-------------+
| \ | \\ | 5C | 5C5C |
+----+------+-------------+-------------+
\もエスケープとして使えるかと思ったらダメだった。 しかし、\と\は最終的には、\と表示されるみたいだ。
ますます混乱してきたな。
サーバに直接16進数表記で文字列を与えてみよう。
どうも、サーバとクライアントの間で、変な変換というか、 ありがた迷惑な自動変換が行なわれているようだ。
この自動変換は、最初クライアントからサーバへ行くときと、 結果をサーバからクライアントに戻すときの2回発生するので、 なかなかややこしいのである。
2回も変換が発生するのではよく分らないので、サーバからクライアントに 戻すときの変換についてのみ考えよう。 とは書いたものの、どうすればそれを調べられるのだろうか。 サーバに自分の思っている通りの文字列データおよびキャラクタセットを 指定できないと実験ができない。
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | sjis | | character_set_connection | ujis | | character_set_database | latin1 | | character_set_results | sjis | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.00 sec)
サーバ側は ujis なので、 \ は 815F で与えなければならない。
mysql> SELECT 0x5C, 0x815F; +------+--------+ | 0x5C | 0x815F | +------+--------+ | \ | \ | +------+--------+ 1 row in set (0.00 sec)
サーバ側(sjis) - - - - クライアント側(ujis)
次に、逆をやってみよう。つまり、端末のキャラクタセットをUJISにして、 以下のように設定する。
mysql> SET NAMES ujis; Query OK, 0 rows affected (0.00 sec) mysql> SET character_set_connection=sjis; Query OK, 0 rows affected (0.01 sec) mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | ujis | | character_set_connection | sjis | | character_set_database | latin1 | | character_set_results | ujis | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.00 sec)
今度は、サーバ側がSJISなので、16進数で与える\ は A1C0 になる。
mysql> SELECT 0x5C, 0xA1C0; +------+--------+ | 0x5C | 0xA1C0 | +------+--------+ | \ | \ | +------+--------+ 1 row in set (0.05 sec)
0x5C に対する表示の \ は、端末がUJISなので半角の¥マークではなく、 半角のバックスラッシュになっている。 (もし今見ている画面がそうでなくても、そう思ってくれ。 端末の画面をキャプチャーして張りつければ一番いいのだが、面倒なのだ)
もうちょっと調べてみよう。
mysql> SELECT HEX('\\');
+-----------+
| HEX('\\') |
+-----------+
| 5C |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT HEX('\');
+----------+
| HEX('\') |
+----------+
| A1C0 |
+----------+
1 row in set (0.00 sec)
今度は、前の逆で、 '\' という全角の逆スラッシュが、 表示されるときには 半角の '\' になっている。
ということは、SJIS と UJIS という2つのキャラクタセットの間の 自動変換が行なわれるとき、\ および \ が 勝手に変ったりするようである。 ありがた迷惑な話である。
フィードバック:
There is no comment.