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
関連リンク
文字列のキャラクタセットを調べる
文字化けが発生したとき、 化けた文字列はどのキャラクタセットとして解釈されるのかを 調べなければならないのだが、それにぴったりの関数が用意されている。
CHARSET( '文字列' )
与えられた 文字列 のキャラクタセットを返す。
非常に分りやすいので、さっそく使ってみよう。
mysql> SELECT CHARSET('abc');
+----------------+
| CHARSET('abc') |
+----------------+
| latin1 |
+----------------+
1 row in set (0.00 sec)
では、日本語を与えてみよう。
mysql> SELECT CHARSET('東京');
+-----------------+
| CHARSET('東京') |
+-----------------+
| latin1 |
+-----------------+
1 row in set (0.00 sec)
日本語の文字列を与えたのに、latin1になってしまった。 これはバグではないか、と思うかもしれないが、その前に システム変数を調べてみよう。
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.02 sec)
というわけで、MySQLは latin1になっているので、ejisに変更してから '東京'のキャラクタセットを調べよう。
mysql> SET NAMES ujis;
Query OK, 0 rows affected (0.05 sec)
mysql> SELECT CHARSET('東京');
+-----------------+
| CHARSET('東京') |
+-----------------+
| ujis |
+-----------------+
1 row in set (0.04 sec)
では、ついでに 'abc' についても確認しておこう。
mysql> SELECT CHARSET('abc');
+----------------+
| CHARSET('abc') |
+----------------+
| ujis |
+----------------+
1 row in set (0.00 sec)
'abc' でも latin1 ではなく、 ujis になってしまうのだ。 latin1の範囲で可能な文字列であっても、 MySQLのキャラクタセットに関連するシステム変数の値に応じて変わるようだ。 クライアントで与える実際の文字列が何であれ、そんなものは どうせMySQLサーバには分らないので、正しく解釈されるように 調整しないといけないのだ。
16進数で与えた場合
mysql> SELECT 0xC5ECB5FE, CHARSET(0xC5ECB5FE); +------------+---------------------+ | 0xC5ECB5FE | CHARSET(0xC5ECB5FE) | +------------+---------------------+ | 東京 | binary | +------------+---------------------+ 1 row in set (0.00 sec) mysql> SELECT X'C5ECB5FE', CHARSET(X'C5ECB5FE'); +-------------+----------------------+ | X'C5ECB5FE' | CHARSET(X'C5ECB5FE') | +-------------+----------------------+ | 東京 | binary | +-------------+----------------------+ 1 row in set (0.01 sec)
たんに16進数で文字列を与えると、binary になってしまう。 表示はこれでもできているが、binaryとなってしまっては後で困ることになる ので、introducerで指定のものにしてやらないといけないのだ。
ということで、introducerをつけてみよう。
mysql> SELECT _ujis X'C5ECB5FE', CHARSET(_ujis X'C5ECB5FE'); +------+----------------------------+ | 東京 | CHARSET(_ujis X'C5ECB5FE') | +------+----------------------------+ | 東京 | ujis | +------+----------------------------+ 1 row in set (0.00 sec)
すべてうまく動いているようだ。ということで、このへんでそっとしておこうかな。
フィードバック:
There is no comment.