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
関連リンク
16進数表記だけでは、キャラクタセットはbinaryになる
16進数表記から文字列を作るで16進数から文字列を作る方法を示した。 でも、これで充分なのだろうか。
たとえば、 0xE1E1 は、ujisならば 瘁 であるが、sjis ならば 矣 である。 つまり、16進数を並べただけでは漢字までは決まらない。 どのキャラクタセットを意味しているのかを示す必要がある。
指定が今までは抜けていたので、 そのときには、どのキャラクタセットになる訳でもなく、 binaryというものになる。キャラクタセットの中には、 実はbinaryというのが用意されているのであった。
使用可能なキャラクタセットの中で、全ての使用可能なキャラクタセットを 示しているが、下から2番目にちゃんとbinaryが存在する。
binaryのままでも動くように書けないことはないが、 きっちり指定したいものである。 もちろん、時には binary の方が都合が良い場合もある。
binaryはとても重要な考えなので、そのうちきちんと説明しようと 思うが、どうなるかは不明。まだ、どこで説明するか考えてもいないのである。
キャラクタセット指定前置子 introducer
そのために、introducer というのが用意されている。 introducer を英辞郎で調べたら 輸入業者 なる訳が出て来たが、 これではなんのことかさっぱり分らないだろう。 introduce という動詞が 紹介するとか、案内するという意味をもち、 ここではそういう類のことをするモノとして使われている。 実際には、C言語などのキャストに近いのではないかと思う。
使い方は、16進数表記された文字列の直前に、キャラクタセット名の直前に _(アンダースコア)がついたものを 置くことで、16進数表示の文字列を、指定したキャラクタセットの 文字列として扱うのである。 ごちゃごちゃ説明するより、サンプルの方が分りやすいだろう。 前回、'漢字表示'という文字列を16進数表記で与えるテストとして、
mysql> SELECT x'B4C1BBFAC9BDBCA8'; +---------------------+ | x'B4C1BBFAC9BDBCA8' | +---------------------+ | 漢字表示 | +---------------------+ 1 row in set (0.00 sec)
を示したが、これはサーバ側で16進数から文字列に直すときに偶然 ujisになっていたので、動いたのである。 つまり、 SET NAMES ujis などにより、適当な状態になっていただけのことである。
キャラクタ端末がSHIFT-JISになり、SET NAMES sjis により、 sjisの環境になったところで、ujisの文字列の16進数表記を 与えるとどうなるであろうか。
mysql> SET NAMES SJIS; Query OK, 0 rows affected (0.00 sec) mysql> SELECT x'B4C1BBFAC9BDBCA8'; +---------------------+ | x'B4C1BBFAC9BDBCA8' | +---------------------+ | エチサ?ノスシィ | +---------------------+ 1 row in set (0.00 sec)
この場合、与えられたバイト列を、無理矢理sjisと解釈するので、 半角カタカナがいっぱいの意味不明な文字列になる。
ここで、introducer _ujis を付け加えてみよう。
mysql> SELECT _ujis x'B4C1BBFAC9BDBCA8'; +----------+ | 漢字表示 | +----------+ | 漢字表示 | +----------+ 1 row in set (0.00 sec)
現在、キャラクタセット関連のシステム変数は
mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | sjis | | character_set_connection | sjis | | character_set_database | latin1 | | character_set_results | sjis | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 6 rows in set (0.04 sec)
となっており、どこにも ujis はない。 それでも、introducerを前に置くことで、指定のキャラクタセットと みなすことができる。 つまり、ujisからsjisに変換すべき個所でちゃんとコード変換が行なわれ、 mysqlの表示もちゃんとなったのである。
introducer 16進数表記
_ujis x'B4C1BBFAC9BDBCA8'
_ujis 0xB4C1BBFAC9BDBCA8
フィードバック:
There is no comment.