$ 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
| name | moji | byte_su |
|---|---|---|
| 鈴木 | 2 | 6 |
| 佐藤 | 2 | 6 |
| 田中 | 2 | 6 |
| 中村 | 2 | 6 |
| 小林 | 2 | 6 |
| 加藤 | 2 | 6 |
| 吉田 | 2 | 6 |
| 山田 | 2 | 6 |
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
次に読む
使い方を順に読むなら
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: 文字列関数と演算子(2026-09-02 確認)