平成30/ 2018-10-21 05:33
MYSQL/char_length, length, 文字サイズ, 文字数

文字列を数えたいときは
char_length()つかいましょ。


>> tableのcharsetが utf8なら以下の結果になる。
mysql> select post_title, char_length(post_title) from wp_posts where post_status='publish';
+--------------------------------------------+-------------------------+
| post_title                                 | char_length(post_title) |
+--------------------------------------------+-------------------------+
| サンプルページ                             |                       7 |
| セキュリティインテリジェンス               |                      14 |
| セキュリティ識別子                         |                       9 |
| さくいんで探す                             |                       7 |
| CPRM                                       |                       4 |
+--------------------------------------------+-------------------------+
5 rows in set (0.01 sec)




>> 以下は、tableのcharsetが latin1 の場合

length()はバイト数なのか良く分からないがUTF8の文字長を確認したところ以下の結果になった。
char_length()を使った方が無難。
これで分かるようにUTF8の全角文字1文字に3バイト、半角英数字に1バイト使っていることが分かる。
テーブル作成時に型の長さを指定するときは考慮すべきだ。
varchar(300)で全角100文字と計算できる。

select *, length(wd), char_length(wd) from memo_wd_everyone;
+-----------------------------------+---------+------------+-----------------+
| wd                                | memo_id | length(wd) | char_length(wd) |
+-----------------------------------+---------+------------+-----------------+
| 労働基準法                   |    1595 |         32 |              15 |
| 事実の不知                   |    1285 |         31 |              15 |
| メモリコンパクション    |     931 |         64 |              30 |
| デフラグ                      |     931 |         27 |              12 |
| デフラグメンテーション |     931 |         71 |              33 |
| フェールオーバ             |     921 |         45 |              21 |
| フェイルオーバ             |     921 |         46 |              21 |
| システムの信頼性          |     921 |         52 |              24 |
| スイッチオーバ             |     921 |         45 |              21 |
| 冗長ビット                   |     919 |         34 |              15 |
| 稼働率                         |     922 |         19 |               9 |
| 良心                            |    1402 |         13 |               6 |
| 良心の呵責                   |    1404 |         32 |              15 |
| w3m                               |    1373 |          3 |               3 |
| 法の不知                      |    1285 |         25 |              12 |
+-----------------------------------+---------+------------+-----------------+
15 rows in set (0.00 sec)

更に以下の結果みてみると半角は1バイトで数えられているのが分かる。
name char_length(name)
R 1
ef 2
JR 2
ACE 3
島 3
薪 3
HUB 3
暁 3
ampm 4



( Thanks. )
11.3. 文字列関数
http://dev.mysql.com/doc/refman/5.1/ja/string-functions.html
# CHAR_LENGTH(str)
文字で測られたストリング str の長さを戻します。マルチバイト文字は、1 文字として数えられます。つまり、2 バイトの文字を 5 つ含むストリングには、CHAR_LENGTH() は 5 を戻すところを、LENGTH() は 10 を戻します。
# LENGTH(str)
バイトで測られたストリング str の長さを戻します。マルチバイト文字は、複数バイトとして数えられます。つまり、2 バイトの文字を 5 つ含むストリングには、CHAR_LENGTH() は 5 を戻すところを、LENGTH() は 10 を戻します。
mysql> SELECT LENGTH('text');
        -> 4