文字列の長さ(キャラクタ長、バイト長)を求める
LENGTH ( string )
LENGTHB ( string )
return [ natural number ]
LENGTH 関数の内容
文字列 string の文字数を戻す。
文字列 string が CHAR 型(⇔VARCHAR2型)の場合には自動的に補完される後続のスペースも長さとしてカウントされる。
LENGTH、LENGTHB 以外にも各国語向け専用の関数がある。
- LENGTHC : 完全な Unicode 用
- LENGTH2 : UCS2 用
- LENGTH4 : UCS4 用
LENGTHB 関数の内容
文字列 string のバイト数を戻す。
全角文字の場合には使用しているキャラクタセットによりバイト数は異なる。
例えば UTF-8 の場合には全角文字 1 文字が 3 バイトになる。⇒ マルチバイト・キャラクタセット
注意 その1
JA16SJIS などの JA16〜系のキャラクタセットにおけるテーブルの項目定義 CHAR(8)*1 の 'あいう'の LENGTH は 5文字となる。
CHAR(8) 'あいう' の LENGTH の内訳:「あいう」で計 6バイト、余った 2バイトに空白が付け加えられる。あいう 3 文字+ 2 つ空白 = 5 文字)
NULL と長さ 0 の文字列('') の LENGTH は NULLとなる。⇒ NULL の特性
注意 その2
マルチバイト・キャラクタセットの CLOB と NCLOB において LENGTHB は使用できない。(DBMS_LOB.LENGTHB がない)
32Kバイト以下の場合には VARCHAR2 に 暗黙変換 して長さを求めることは可能。
⇒ CLOB 型の内部形式 / LOB 型の格納方式
LENGTH の使用例
JA16SJIS 環境において CHAR(10 byte) と VARCHAR2(10 byte) の LENGTH の違い
SQL> create table rivus.length_sample
2 ( char10 char(10),
3 vchar2_10 varchar2(10));
SQL> set null '<NULL>'
SQL> select char10, LENGTH(char10), vchar2_10, LENGTH(vchar2_10) from length_sample;
CHAR10 LENGTH(CHAR10) VCHAR2_10 LENGTH(VCHAR2_10)
------------ -------------- ------------ -----------------
あ 9 あ 1
あい 8 あい 2
abc 10 abc 3
<NULL> <NULL> <NULL> <NULL>
あいうえお 5 あいうえお 5
あx 9 あx 2
LENGTHB の使用例
LENGTHB 関数と LENGTH 関数の比較サンプル(JA16SJIS 環境において)
SQL> select vchar2_10, LENGTHB(vchar2_10), length(vchar2_10) from length_sample;
VCHAR2_10 LENGTHB(VCHAR2_10) LENGTH(VCHAR2_10)
------------ ------------------ -----------------
あ 2 1
あい 4 2
abc 3 3
<NULL> <NULL> <NULL>
あいうえお 10 5
あx 3 2
豆知識
LENGTH、LENGTHB では長さ0の文字列の長さは計れない。RAW 型のバイト長も正しい結果にならない。
LENGTH0 関数(長さ0 の文字列を長さ0 とする LENGTH)
長さ0 の文字列('') は LENGTH 関数において NULL となる、また、NULL 値 の文字列長も同様に NULL となる。
これは 長さ0 の文字列が NULL 値と区別できない。NULL 値の現在の仕様である。 (Oracle 10g 時点)
CREATE OR REPLACE FUNCTION RIVUS.LENGTH0(P_STR IN VARCHAR2)
RETURN PLS_INTEGER
IS
BEGIN
RETURN NVL(LENGTH(P_STR),0);
END;
/
RAW 型のバイト列の長さを計る
RAW 型のバイト長を計るには UTL_RAW.LENGTH を使用する。
LENGTHB は RAW データを 文字列型(VARCHAR2)に 暗黙変換 するため、AL32UTF8 の '0' は '30'(← 0x30) になり想定していた2倍の長さになる。
SQL> SELECT UTL_RAW.LENGTH(UTL_I18N.STRING_TO_RAW('ABCDEF', 'AL32UTF8')) UTL_RAW_LEN ,
2 LENGTHB(UTL_I18N.STRING_TO_RAW('ABCDEF', 'AL32UTF8')) LENB
3 FROM DUAL
4 /
UTL_RAW_LEN LENB
----------- ----------
6 12
SQL 関数 - LENGTH,LENGTHB 関連
- 部分文字列の位置を求める ⇒ instr ( s1, s2, p, o )
- 部分文字列を切り出す ⇒ substr ( s1, p, l )
- 文字列を文字単位に置換する ⇒ translate ( e, f, t )
- 文字列を単語レベルで置換する ⇒ replace ( s1, s2, r )
- NULL を別の値に変換する ⇒ nvl ( e1, e2 )