仅在文本字段中强制使用可打印字符
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"
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"