Open Source WEB

与えられた文字列と異なるキャラクタセットをintroducerで指定

SET NAMES UJISにてキャラクタセットがujisで、 キャラクタ端末も ujis になっているとしよう。

ここで、

mysql> SELECT '漢字表示';
+----------+
| 漢字表示 |
+----------+
| 漢字表示 |
+----------+
1 row in set (0.00 sec)

となるのは当然である。

マニュアルを見ると、普通の文字列の直前にも introducer を置くことができるとある。 まずは安全と思われる _ujis を付加してみよう。

mysql> SELECT _ujis '漢字表示';
+----------+
| 漢字表示 |
+----------+
| 漢字表示 |
+----------+
1 row in set (0.01 sec)

予想通り、余計な影響は出ないようだ。 ここでは、'漢字表示' は元々 ujisの文字列なので、それに _ujis をつけても 同じキャラクタセットなので影響がない。

では、ujisの文字列の前に、_sjisを付加するとどうなるであろうか。

mysql> SELECT _sjis '漢字表示';
+-----------------+
| エチサ?ノスシィ |
+-----------------+
| エチサ?ノスシィ |
+-----------------+
1 row in set (0.00 sec)

'漢字表示'というujisの文字列を無理矢理sjisの文字列として解釈させたため、 変なことになったのではないかと思う。


introducer でバイト列の中味はどうなったか

文字列(バイト列)の中味がどうなったかは、HEX()関数を使えばすぐ分る。

mysql> SELECT HEX('漢字表示');
+------------------+
| HEX('漢字表示')  |
+------------------+
| B4C1BBFAC9BDBCA8 |
+------------------+
1 row in set (0.00 sec)
 
mysql> SELECT HEX(_sjis '漢字表示');
+-----------------------+
| HEX(_sjis '漢字表示') |
+-----------------------+
| B4C1BBFAC9BDBCA8      |
+-----------------------+
1 row in set (0.00 sec)

ということで、_sjisというのを付加しても、16進数表示させると、 中味はujisのままであることが分る。

introducerはバイト列の内容は変えない。

文字列(バイト列)のキャラクタセットを変更する。


_binaryというintroducer

今までは、_ujis, _sjis, _utf8 などなんらかのキャラクタセットに するような使い方を説明してきたが、どのキャラクタセットでもなく、 単なるバイト列として解釈させるためにbinaryというのがキャラクタセット に含まれており、_binaryというintroducerもある。

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

mysql> SELECT 0xB4C1BBFAC9BDBCA8;
+--------------------+
| 0xB4C1BBFAC9BDBCA8 |
+--------------------+
| 漢字表示           |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT _binary 0xB4C1BBFAC9BDBCA8;
+----------+
|          |
+----------+
| 漢字表示 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT _binary '漢字表示';
+----------+
|          |
+----------+
| 漢字表示 |
+----------+
1 row in set (0.00 sec)

_binary は、0xB4C1BBFAC9BDBCA8 の前でも、'漢字表示' の前でも同じになっている。 実際には、binaryからujisに変換され、ちゃんと結果が漢字で表示されているのだが、 binaryからujisへの変換では、中味は何も変らないし、 元々ujisの値になっていたので正しく表示された訳だ。

しかし、値は正しく表示されるものの、タイトルは空白になってしまった。 何か悪いことをしてしまったようなので、今日はここで終ろう。


戻る:バイト列のキャラクタセット指定をするintroducer

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


フィードバック:

Name:
Comment:

There is no comment.

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

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