Open Source WEB

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)

こちらも問題ないようだ。でも、表は際限なく壊れていくなぁ。


戻る:LENGTH()で文字列長を求める

次へ:テーブルの縦線が揃わない


フィードバック:

Name:
Comment:

There is no comment.

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

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