Open Source WEB

データベースにつっこむデータの多くは文字列データであり、 その長さは様々な使われ方をする。 そのための基本となるのが、長さを求める関数であり、 長さの意味がちゃんと理解できれば、文字列の扱いがかなり自由にできるようになる。

文字列長なんて簡単なことだと思うだろう。でも、そうかな?

【注意】このページには、半角カタカナが使われていたりする。 大丈夫でないブラウザがあるかも知れないが、 そういうことへの対応は面倒なので、とりあえずは考えないことにする。


文字列長を求める関数 LENGTH()

文字列長を求める関数として、LENGTH() がある。

LENGTH(文字列)  ─→  文字列長

とにかく使ってみよう。

端末を SHIFT-JIS にして、MySQLは cp932 にして試してみよう。

mysql> SET NAMES cp932;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT '日本語の旅', LENGTH('日本語の旅');
+------------+----------------------+
| 日本語の旅 | LENGTH('日本語の旅') |
+------------+----------------------+
| 日本語の旅 |                   10 |
+------------+----------------------+
1 row in set (0.00 sec)

'日本語の旅'という漢字5文字の文字列長が10になってしまった。 今は cp932(SHIFT-JIS) であり、漢字は2バイトなので、これはもしかして 日本語としての文字数ではなく、バイト長を返しているのではないだろうか。

いや、推測(邪推)はいけない。 ちゃんとマニュアルを読むしかない。 できるだけ、英語で読もう(英語で読みたいものだ)。

String Functions には

LENGTH(str)

  Returns the length of the string str, measured in bytes.A multi-byte 
  charactercounts as multiple bytes. This means that for a string containing
  five two-byte characters,LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

  mysql> SELECT LENGTH('text');
        -> 4

とあり、これは長さというより、バイト長を返すのである。 したがって、'日本語の旅'は10になってしまう訳だ。

ちょっと半角カタカナについても調べておこう。

mysql> SELECT 'ニホンゴノタビ', LENGTH('ニホンゴノタビ');
+-----------+---------------------+
| ニホンゴノタビ | LENGTH('ニホンゴノタビ') |
+-----------+---------------------+
| ニホンゴノタビ |                   9 |
+-----------+---------------------+
1 row in set (0.00 sec)

半角カタカナは1文字1バイトなので、問題ないようだ。

ここで端末をEUC-JPにし、MySQLを eucjpms にして半角カタカナを試してみよう。

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

mysql> SELECT 'ニホンゴノタビ', LENGTH('ニホンゴノタビ');
+--------------------+------------------------------+
| ニホンゴノタビ | LENGTH('ニホンゴノタビ') |
+--------------------+------------------------------+
| ニホンゴノタビ |                           18 |
+--------------------+------------------------------+
1 row in set (0.00 sec)

mysql> SELECT HEX('ニホンゴノタビ');
+--------------------------------------+
| HEX('ニホンゴノタビ')            |
+--------------------------------------+
| 8EC68ECE8EDD8EBA8EDE8EC98EC08ECB8EDE |
+--------------------------------------+
1 row in set (0.01 sec)

EUC-JPでは半角カタカナは2バイトで、第1バイトが8Eになるのであった。

ついでに、utf8にしたらどうなるか、調べてみよう。

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT 'ニホンゴノタビ', LENGTH('ニホンゴノタビ');
+-----------------------------+---------------------------------------+
| ニホンゴノタビ | LENGTH('ニホンゴノタビ') |
+-----------------------------+---------------------------------------+
| ニホンゴノタビ |                                    27 |
+-----------------------------+---------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT HEX('ニホンゴノタビ');
+--------------------------------------------------------+
| HEX('ニホンゴノタビ')                     |
+--------------------------------------------------------+
| EFBE86EFBE8EEFBE9DEFBDBAEFBE9EEFBE89EFBE80EFBE8BEFBE9E |
+--------------------------------------------------------+
1 row in set (0.00 sec)

utf8では、半角カタカナは3バイトになってしまう。 先頭の2バイトがEFBDまたはEFBEになるようだ。

それにしても、同じ文字が、キャラクタセットが違うだけで、 1バイトになったり、3バイトになったり困ったものである。


他のDBではLENGTH()はどうなるのだろうか

さて、LENGTH()は、他のDBでもバイト長をかえすのだろうか、 それとも実際の文字数になるのだろうか。

LENGTH(文字列)が返す値

バイト長: MySQL, DB2

文字列長: Oracle, PostgreSQL, SQL Server, Access

ということで、さっぱり統一していないようだ。 まったく困ったものである。

こういう細かい違いを知り尽くしているのがDBのプロ

                    ‥‥‥‥ 嘘だ!


戻る:〜が~に文字化けするのは直ったか

次へ:CHARACTER_LENGTH()で文字列長を求める


フィードバック:

Name:
Comment:

There is no comment.

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

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