コマンド道場

$ man length

LENGTH / CHAR_LENGTH

文字列関数

文字列の長さを返す。数えるのは文字数で、バイト数ではない。

呼び出しの形

LENGTH(文字列)
CHAR_LENGTH(文字列)
OCTET_LENGTH(文字列)

つまずきやすいところ

  • MySQL の LENGTH はバイト数です。文字数がほしいなら CHAR_LENGTH を使ってください。移植したときに条件式が静かにずれます。

  • 末尾の空白の扱いが型で変わります。char(n) は空白で埋められるので、varchar に入れたときと長さが違って見えることがあります。

  • LENGTH(NULL) は 0 ではなく NULL です。COALESCE で埋めるか、IS NULL を別に判定してください。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

文字数とバイト数を並べて見る
SELECT name, LENGTH(name) AS moji, OCTET_LENGTH(name) AS byte_su FROM shain ORDER BY shain_id
namemojibyte_su
鈴木26
佐藤26
田中26
中村26
小林26
加藤26
吉田26
山田26

18(うち 8 行を表示)

日本語は 1 文字あたり 3 バイト(UTF-8)なので、値が 3 倍になります。

文字数で絞り込む
SELECT name FROM shain WHERE CHAR_LENGTH(name) >= 2 ORDER BY shain_id
name
鈴木
佐藤
田中
中村
小林
加藤
吉田
山田

18(うち 8 行を表示)

説明

LENGTH は文字列の長さを返します。PostgreSQL では文字数を数えるので、日本語 1 文字も 1 と数えられます。標準 SQL の CHAR_LENGTH も同じ意味です。

バイト数がほしいときは OCTET_LENGTH を使います。UTF-8 なら日本語 1 文字は 3 バイトなので、両者の値ははっきり違います。「桁数の上限」を検査するとき、どちらを数えるべきかは要件によって変わります。

⚠️ 製品によって LENGTH の意味が違います。Oracle の LENGTH は文字数ですが LENGTHB がバイト数、MySQL は LENGTHバイト数CHAR_LENGTH が文字数です。移植するときにいちばん静かに壊れるのがこの関数です。

ほかの製品でも通るか

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / Oracle Database

  • SQL Server では使えませんLENGTH(文字数)

未確認: IBM Db2

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報