【问题标题】:Enforce printable characters only in text fields仅在文本字段中强制使用可打印字符
【发布时间】:2022-01-15 05:50:29
【问题描述】:

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

虽然我同意在某些情况下需要控制字符,但在人名、文档编号等普通属性中很少(甚至没有)使用这些字符。事实上,允许将这些字符存储在 DB 中可以导致令人讨厌的问题,因为字符是不可见的,并且属性的值不是最终用户看起来的值。

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

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

【问题讨论】:

    标签: postgresql types user-defined-data-types


    【解决方案1】:

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

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

    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"
    

    【讨论】:

    • 谢谢@Laurenz Albe 的回答。我一直在等着看看是否有人提出了替代方案,但似乎没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2012-03-14
    相关资源
    最近更新 更多