Open Source WEB

文字列のキャラクタセットを調べる

文字化けが発生したとき、 化けた文字列はどのキャラクタセットとして解釈されるのかを 調べなければならないのだが、それにぴったりの関数が用意されている。

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)

すべてうまく動いているようだ。ということで、このへんでそっとしておこうかな。


戻る:普通の文字列にもintroducerを付加できる

次へ:CHARSET()でさらなるキャラクタセットの調査


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us