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
関連リンク
sjisの代わりにcp932、ujisの代わりにeucjpmsを使ったら、 いままで起きていた文字化けは直るのだろうか? 今回をそれをチェックしてみよう。
テストをきちんと行なうのは面倒なので、 バックスラッシュ(\,5C)が文字化けする で行なったことを、新しいキャラクタセットに置き換えて逐次試すことにしよう。 (これなら、頭を使わなくて済む!)
サーバ側(sjis) - - - - クライアント側(sjis)
端末の文字コードを Shift-JIS にして、以下を行なってみた。
mysql> SET NAMES cp932; Query OK, 0 rows affected (0.00 sec) mysql> SELECT '\\'; +---+ | \ | +---+ | \ | +---+ 1 row in set (0.03 sec)
大丈夫そうなので、次!
mysql> SELECT HEX('\\');
+-----------+
| HEX('\\') |
+-----------+
| 5C |
+-----------+
1 row in set (0.08 sec)
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | latin1 | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.00 sec)
なんら問題なし。
サーバ側(ujis) - - - - クライアント側(sjis)
コネクションキャラクタセットだけを ujis ではなく、 新キャラクタセットの eucjpms にする。
mysql> SET character_set_connection=eucjpms; Query OK, 0 rows affected (0.03 sec) mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | cp932 | | character_set_connection | eucjpms | | character_set_database | latin1 | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+---------+ 6 rows in set (0.00 sec)
mysql> SELECT '\\'; +---+ | \ | +---+ | \ | +---+ 1 row in set (0.00 sec)
これでも、全角の\になったりすることはない。
比較対象:バックスラッシュ(\,5C)が文字化けする(続編)
サーバ側(ujis) - - - - クライアント側(sjis)
端末の文字コードは変更していないので、Shift-JIS のままである。
mysql> SET NAMES cp932; Query OK, 0 rows affected (0.00 sec) mysql> SET character_set_connection=eucjpms; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | cp932 | | character_set_connection | eucjpms | | character_set_database | latin1 | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+---------+ 6 rows in set (0.01 sec)
mysql> SELECT '\'; +----+ | \ | +----+ | \ | +----+ 1 row in set (0.03 sec)
\は\となったのでOK。 前は \ が \ になってしまったのであった。
mysql> SELECT HEX('\');
+-----------+
| HEX('\') |
+-----------+
| A1C0 |
+-----------+
1 row in set (0.00 sec)
これは、\の EUC-JP のコードでありOK。
mysql> SELECT '\\', '\\', HEX('\\'), HEX('\\');
+---+------+-----------+-------------+
| \ | \\ | HEX('\\') | HEX('\\') |
+---+------+-----------+-------------+
| \ | \\ | 5C | A1C0A1C0 |
+---+------+-----------+-------------+
1 row in set (0.00 sec)
これが、以前はメタメタになったのであった。
サーバに直接16進数表記で文字列を与えてみよう
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | cp932 | | character_set_connection | eucjpms | | character_set_database | latin1 | | character_set_results | cp932 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+---------+ 6 rows in set (0.00 sec)
サーバ側はeucjpms、つまりEUC-JPなので、\ は 815F で与えなければならない。
mysql> SELECT 0x5C, 0x815F; +------+--------+ | 0x5C | 0x815F | +------+--------+ | \ | \ | +------+--------+ 1 row in set (0.00 sec)
サーバ側(cp932) - - - - クライアント側(eucjpms)
次に、逆をやってみよう。 つまり、端末のキャラクタセットをEUC-JPにして、以下のように設定する。
mysql> SET NAMES 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 | cp932 | | character_set_database | latin1 | | character_set_results | eucjpms | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+---------+ 6 rows in set (0.00 sec)
今度は、サーバ側がcp932(SJIS)なので、16進数で与える\ は A1C0 になる。
mysql> SELECT 0x5C, 0xA1C0; +------+--------+ | 0x5C | 0xA1C0 | +------+--------+ | \ | \ | +------+--------+ 1 row in set (0.08 sec)
mysql> SELECT HEX('\\');
+-----------+
| HEX('\\') |
+-----------+
| 5C |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT HEX('\');
+-----------+
| HEX('\') |
+-----------+
| 815F |
+-----------+
1 row in set (0.00 sec)
2回ぶんも調べたが、問題は全然発生しないようだ。
フィードバック:
There is no comment.