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
関連リンク
システムが返すもののキャラクタセットは何だろう?
システムが返してくるものは色々あるのだが、 たとえば 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_何とか というのがどういう働きをするかは 文字列処理に関してはとても重要なので、そのうちちゃんと調べて書くことにしよう。
実は、まだ私も良く知らなかったりするのだが。
フィードバック:
There is no comment.