半角を1、全角を2文字として文字数をカウント

Posted by @kachina_t on Mon, Apr 18, 2011
In Development
Tags development

別システムとのデータ連携で『全角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;

ばっちし!