我有一个
Postgresql 9.3数据库编码’UTF8′.但是,数据库中有一列不应包含除ASCII之外的任何内容.如果非ascii进入那里,它会导致另一个我无法控制的系统出现问题.因此,我想为列添加约束.注意:我已经有一个BEFORE INSERT触发器 – 所以这可能是一个检查的好地方.
为此,您可以将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位)编码,因此该方法不是可能.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。