PostgreSQL全半角转换函数

曾在一个项目中,由于邮编字段的数字录入时没有进行数字校验,出现全角数字字符,后来用户要求将全角数字在PostgreSQL数据库中转为半角。受网上技术文章启发,自己写了一个plpgsql对应的全半角转换函数。在此记录下来。
--全半角转换函数
--text:转换源字符
--integer:1-全角,其它-半角
CREATE OR REPLACE FUNCTION convertstring(text, integer)
  RETURNS text AS
$$
  DECLARE len INTEGER;
  DECLARE retval text;
  DECLARE tmp text;
  DECLARE asciival INT4;
  
  BEGIN
    --字符串字符个数
    SELECT textlen($1) INTO len;
    
    SELECT '' INTO retval;
    
    --循环
    FOR i IN 1..len LOOP
      --取单个字符
      SELECT substring($1, i, 1) INTO tmp;
      SELECT ascii(tmp) INTO asciival;
      
      IF ($2 = 1) THEN
        BEGIN
          --全角转半角
          IF (asciival = 12288) THEN  --空格
            asciival = 32;
          END IF;
          IF (asciival > 65280) AND (asciival < 65375) THEN
            SELECT asciival-65248 INTO asciival;
          END IF;
        END;
      ELSE
        BEGIN
          --半角转全角
          IF (asciival = 32) THEN --空格
            asciival = 12288;
          END IF;
          IF (asciival < 127) THEN
            SELECT asciival+65248 INTO asciival;
          END IF;
        END;
      END IF;
      
      SELECT chr(asciival) INTO tmp;
      
      SELECT textcat(retval, tmp) INTO retval;
    END LOOP;
    
    RETURN retval;
  END;
  $$
    LANGUAGE 'plpgsql'
    SECURITY DEFINER;

你可能感兴趣的:(Security,PostgreSQL)