consistency character varying NOT NULL DEFAULT 'Y'::character varying
它用作布尔值,值应始终为(‘Y’|’N’).
注意:没有检查约束等
我想提出理由来改变这个领域.这是我有的:
>它被用作一个布尔值,所以做到这一点.显性优于隐性.
>它将防止编码错误,因为现在有什么可以转换为文本将盲目地在那里.
这是我的问题.
>大小/存储怎么样?数据库是UTF-8.所以,我觉得在这方面真的没有太多的积蓄.对于布尔值应该是1个字节,而在UTF-8中应该是1字节的’Y'(至少这是我在Python中检查长度的时候).这里有没有其他存储开销将被保存?
>查询性能? Postgres会因为“= TRUE”与“=”Y“”的原因获得任何性能提升?
boolean
type.通常,“yes / no”应该是布尔值.这是正确的使用类型!
大小/存储?
基本上,boolean
列在磁盘上占用1个字节,
而文字或字符变化(quoting the manual here)…
the storage requirement for a short string (up to 126 bytes) is 1 byte
plus the actual string
这是简单字符的2个字节.因此,您可以将该列的存储空间减半.
实际存储比这更复杂.每个表有一些固定的开销,page and row,有特殊的NULL
storage,有些类型需要data alignment.总体影响将是非常有限的 – 如果明显的话.
More on how to measure actual space requirement.
编码UTF8在这里没有任何区别.基本ASCII字符与其他编码如LATIN-1是位兼容的.
在你的情况下,根据你的描述,你应该保持NOT NULL constraint你似乎已经有了 – 独立于基础类型.
在任何情况下,布尔值稍微好一些.除了稍微小一点之外,布尔的逻辑更简单,并且varchar或文本也通常负载了COLLATION的具体规则.但是不要为那些简单的事情预料不到.
代替
WHERE consistency = 'Y'
你可以写:
WHERE consistency = TRUE
但是,真的,你可以简化为:
WHERE consistency
不需要进一步的评估.
更改类型
改变你的桌子很简单:
ALTER TABLE tbl ALTER consistency TYPE boolean USING CASE consistency WHEN 'Y' THEN TRUE ELSE FALSE END;
此CASE表达式将所有不为TRUE(“Y”)的内容都折成FALSE. NOT NULL约束只剩下.