加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgresql约束检查非ascii字符

发布时间:2020-12-13 18:07:47 所属栏目:百科 来源:网络整理
导读:我有一个 Postgresql 9.3数据库编码’UTF8′.但是,数据库中有一列不应包含除ASCII之外的任何内容.如果非ascii进入那里,它会导致另一个我无法控制的系统出现问题.因此,我想为列添加约束.注意:我已经有一个BEFORE INSERT触发器 – 所以这可能是一个检查的好地
我有一个 Postgresql 9.3数据库编码’UTF8′.但是,数据库中有一列不应包含除ASCII之外的任何内容.如果非ascii进入那里,它会导致另一个我无法控制的系统出现问题.因此,我想为列添加约束.注意:我已经有一个BEFORE INSERT触发器 – 所以这可能是一个检查的好地方.

在PostgreSQL中实现这一目标的最佳方法是什么?

为此,您可以将ASCII定义为序号1到127,因此以下查询将标识具有“非ascii”值的字符串:
SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127);

但它不太可能超级高效,并且使用子查询会强制您在触发器而不是CHECK约束中执行此操作.

相反,我会使用正则表达式.如果您想要所有可打印字符,则可以在检查约束中使用范围,例如:

CHECK (my_column ~ '^[ -~]*$')

this will match everything from the space to the tilde,这是可打印的ASCII范围.

如果您想要所有ASCII,可打印和不可打印,您可以use byte escapes:

CHECK (my_column ~ '^[x00-x7F]*$')

最严格的正确方法是convert_to(my_string,’ascii’)并且如果失败则引发异常……但PostgreSQL不提供ascii(即7位)编码,因此该方法不是可能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读