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
関連リンク
データベースにつっこむデータの多くは文字列データであり、 その長さは様々な使われ方をする。 そのための基本となるのが、長さを求める関数であり、 長さの意味がちゃんと理解できれば、文字列の扱いがかなり自由にできるようになる。
文字列長なんて簡単なことだと思うだろう。でも、そうかな?
【注意】このページには、半角カタカナが使われていたりする。 大丈夫でないブラウザがあるかも知れないが、 そういうことへの対応は面倒なので、とりあえずは考えないことにする。
文字列長を求める関数 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バイトなので、これはもしかして 日本語としての文字数ではなく、バイト長を返しているのではないだろうか。
いや、推測(邪推)はいけない。 ちゃんとマニュアルを読むしかない。 できるだけ、英語で読もう(英語で読みたいものだ)。
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()で文字列長を求める
フィードバック:
There is no comment.