仅在文本字段中强制使用可打印字符

Enforce printable characters only in text fields

PostgreSQL数据库中的text数据类型(编码为utf-8)可以包含任何UTF-8字符。其中包括一些控制字符 (https://en.wikipedia.org/wiki/Unicode_control_characters)

虽然我同意在某些情况下需要控制字符,但很少(none)在普通属性(如人名、文档编号等)中使用这些字符。实际上允许使用此类字符存储在数据库中可能会导致严重的问题,因为字符不可见并且属性的值与最终用户看起来不同。

由于问题似乎很普遍,有没有办法防止文本字段中出现控制字符?也许有一种特殊的文本类型(例如 citext 用于区分大小写的文本)?还是应该将此行为实现为域?还有其他选择吗?我能发现人们谈论的只是使用正则表达式查找这些字符。

我找不到任何解决问题的一般性建议,所以我可能在这里遗漏了一些明显的东西。

确切答案取决于您认为可打印的内容。

但是,域是必经之路。如果您想使用数据库排序规则认为可打印的字符,请使用这样的域:

CREATE DOMAIN printable_text AS text CHECK (VALUE !~ '[^[:print:]]');

SELECT 'a'::printable_text;
 printable_text 
════════════════
 a
(1 row)

SELECT E'\u0007'::printable_text;  -- bell character (ASCII 7)
ERROR:  value for domain printable_text violates check constraint "printable_text_check"