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
関連リンク
MySQLでは、LENGTH()は文字列の長さではなく、 文字列のバイト数になってしまった。
それでは、どの関数が実際の文字数を返してくれるのだろうか。
文字列長を求める関数 CHARACTER_LENGTH()
文字列長を求める関数として、CHARACTER_LENGTH()があった。 短くしたCHAR_LENGTH()でも動作は同じらしい。
CHARACTER_LENGTH() ─→ 文字列長
CHAR_LENGTH() ─→ 文字列長
とにかく、使ってみよう。
端末を SHIFT-JIS にして、MySQLは cp932 にして試してみよう。
mysql> SET NAMES cp932;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH('日本語の旅'), CHARACTER_LENGTH('日本語の旅');
+----------------------+--------------------------------+
| LENGTH('日本語の旅') | CHARACTER_LENGTH('日本語の旅') |
+----------------------+--------------------------------+
| 10 | 5 |
+----------------------+--------------------------------+
1 row in set (0.00 sec)
LENGTH()はバイト数の10を返し、CHARACTER_LENGTHは文字数の5を返すようだ。 これこそ日本語で必要としている文字列長である。 文字列長だと混乱するかもしれないので、 文字数という言い方が適切かも知れない。
CHARACTER_LENGTH(), CHAR_LENGTH() についても、 ちゃんとマニュアルで確かめておこう。
CHAR_LENGTH(str) Returns the length of the string str, measured in characters. A multi-byte character counts as a single character. This means that for a string containing five two-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5. CHARACTER_LENGTH(str) CHARACTER_LENGTH() is a synonym for CHAR_LENGTH().
ということで、この関数は文字数を返す。
半角カタカナも正しく文字数を返すのか確かめておこう。
mysql> SELECT LENGTH('ニホンゴノタビ'), CHARACTER_LENGTH('ニホンゴノタビ');
+---------------------+-------------------------------+
| LENGTH('ニホンゴノタビ') | CHARACTER_LENGTH('ニホンゴノタビ') |
+---------------------+-------------------------------+
| 9 | 9 |
+---------------------+-------------------------------+
1 row in set (0.01 sec)
どちらも同じ9を返すが、半角カタカナ1文字は1バイトなので、当然である。
EUC-JPでも試してみよう。
mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH('ニホンゴノタビ'), CHARACTER_LENGTH('ニホンゴノタビ');
+------------------------------+----------------------------------------+
| LENGTH('ニホンゴノタビ') | CHARACTER_LENGTH('ニホンゴノタビ') |
+------------------------------+----------------------------------------+
| 18 | 9 |
+------------------------------+----------------------------------------+
1 row in set (0.00 sec)
表の形はどんどん壊れて行くが、CHARACTER_LENGTH()はちゃんと9になっている。
utf8についても試してみよう。
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT LENGTH('ニホンゴノタビ'), CHARACTER_LENGTH('ニホンゴノタビ');
+---------------------------------------+-------------------------------------------------+
| LENGTH('ニホンゴノタビ') | CHARACTER_LENGTH('ニホンゴノタビ') |
+---------------------------------------+-------------------------------------------------+
| 27 | 9 |
+---------------------------------------+-------------------------------------------------+
1 row in set (0.00 sec)
こちらも問題ないようだ。でも、表は際限なく壊れていくなぁ。
次へ:テーブルの縦線が揃わない
フィードバック:
There is no comment.