因数据库使用UTF-8,保存中文使用3个字节,英文和数字使用1个字节,有一个需求需要把一个中文统计为1, postgresql的length、regexp_matches、char_length均是按字节计算长度,因此需要重新写一个计算规则。
原理:把数字英文、中文分别计算。
with t1 as (
select char_length(regexp_matches('123中123abc','[a-zA-Z0-9]+','g')::text)-2 as len
union all
select (char_length(regexp_matches('123中123abc','[^a-zA-Z0-9]+','g')::text)-2)/3 as len
)
select sum(len)::int as len from t1