Open Source WEB

システムが返すもののキャラクタセットは何だろう?

システムが返してくるものは色々あるのだが、 たとえば version() はバージョンを示す文字列を返すのだが、 そのキャラクタセットは何だろうか?

mysql> SELECT VERSION(), CHARSET(VERSION());
+---------------------+--------------------+
| VERSION()           | CHARSET(VERSION()) |
+---------------------+--------------------+
| 5.0.4-beta-standard | utf8               |
+---------------------+--------------------+
1 row in set (0.00 sec)

'5.0.4-beta-standard' という文字列のキャラクタセットは utf8 であった。

mysql> SELECT USER(), CHARSET(USER());
+----------------+-----------------+
| USER()         | CHARSET(USER()) |
+----------------+-----------------+
| root@localhost | utf8            |
+----------------+-----------------+
1 row in set (0.00 sec)

どうも、システム関係は utf8 であるらしい。


時間のキャラクタセットは?

時間の型はtimestampに決まっているではないか。 とはいえ、調べてみよう。

mysql> SELECT NOW(), CHARSET(NOW());
+---------------------+----------------+
| NOW()               | CHARSET(NOW()) |
+---------------------+----------------+
| 2005-05-15 19:05:15 | binary         |
+---------------------+----------------+
1 row in set (0.00 sec)

binary になるようだ。


数値のキャラクタセットは?

もっとエスカレートして、数値のキャラクタセットも調べてみよう。

mysql> SELECT CHARSET(1),CHARSET(1.23);
+------------+---------------+
| CHARSET(1) | CHARSET(1.23) |
+------------+---------------+
| binary     | binary        |
+------------+---------------+
1 row in set (0.00 sec)

数値が binary になるのは、まあ当然かな。


HEX() のキャラクタセットは

関数HEX()の出力は16進数表記の文字列であるが、これは一体何になるのだろうか? utf8 それとも binary ?それとも SET NAMES で指定した ujis かな?

mysql> SELECT HEX('東京'), CHARSET(HEX('東京'));
+-------------+----------------------+
| HEX('東京') | CHARSET(HEX('東京')) |
+-------------+----------------------+
| C5ECB5FE    | ujis                 |
+-------------+----------------------+
1 row in set (0.00 sec)

ということで、SET NAMES で指定した ujis になった。 もっと詳しく、キャラクタセット関連のどのシステム変数が反映されるのか 追及してみよう。

mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT HEX('Tokyo'), CHARSET(HEX('Tokyo'));
+--------------+-----------------------+
| HEX('Tokyo') | CHARSET(HEX('Tokyo')) |
+--------------+-----------------------+
| 546F6B796F   | latin1                |
+--------------+-----------------------+
1 row in set (0.00 sec)

mysql> set character_set_connection = ujis;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT HEX('Tokyo'), CHARSET(HEX('Tokyo'));
+--------------+-----------------------+
| HEX('Tokyo') | CHARSET(HEX('Tokyo')) |
+--------------+-----------------------+
| 546F6B796F   | ujis                  |
+--------------+-----------------------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | ujis   |
| character_set_database   | latin1 |
| character_set_results    | latin1 |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.00 sec)

ということで、

HEX() のキャラクタセットは、システム変数 character_set_connection の値になる。

HEX()という関数は、MySQLサーバ側で動いているから、character_set_server の値が反映されるように思ってしまうだろうが、そうではなくて、 character_set_connection なのである。

システム変数のうち、character_set_何とか というのがどういう働きをするかは 文字列処理に関してはとても重要なので、そのうちちゃんと調べて書くことにしよう。

実は、まだ私も良く知らなかったりするのだが。


戻る:CHARSET()で文字列のキャラクタセットを得る

次へ:CONVERT()でキャラクタセットの変換をする


フィードバック:

Name:
Comment:

There is no comment.

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

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