別システムとのデータ連携で『全角10/半角20文字』なんてのが良くあります。
sjisやeucの名残なのかな。。。
今回もそんなお話で、企業間EDIの案件で
既存データ内に上限文字数を超過したレコードを
ピックアップしてあげて、クライアントにデータ調整をしてもらうことになりました。
深く考えないで、リストアップ作業を請け負ったのですが
UTF-8は可変長の1~4バイトなので単純に、char_lenght()やoctet_length()じゃダメだったのね
それではってコトで、先のルールでカウントを取れるストアド作ったので掲載します。
【ソース】
CREATE OR REPLACE FUNCTION original_length(v_text IN varchar) RETURNS integer AS '
DECLARE
i_cnt integer default 0;
i_ret integer default 0;
BEGIN
IF v_text IS NULL OR v_text = \'\' THEN
return 0;
END IF;
FOR i_cnt IN 1..LENGTH(v_text) LOOP
IF 1 < OCTET_LENGTH(SUBSTR(v_text, i_cnt, 1)) THEN
i_ret := i_ret + 2;
ELSE
i_ret := i_ret + 1;
END IF;
END LOOP;
RETURN i_ret;
END;
' LANGUAGE plpgsql;
【使用例】
example_db=# SELECT ORIGINAL_LENGTH('あいうえお');
original_length
-----------------
10
(1 row)
example_db=# SELECT ORIGINAL_LENGTH('abcdefあいうえお');
original_length
-----------------
16
(1 row)
example_db=# SELECT id,
example_db-# name
example_db-# FROM products
example_db-# WHERE 20 < ORIGINAL_LENGTH(name)
example_db-# ORDER BY id;
ばっちし!