最近新项目开始,需要设计数据库,技术大佬用了很多我之前没见过的数据库数据类型,这里做个总结
1.货币类型
money
类型存储固定小数精度的货币数字,表中展示的范围假设有两个小数位。可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如'$1,000.00'
。货币的类型由lc_monetary
(string
)设置用于格式化货币量的区域数据类型
numeric
、int
和bigint
的值可以被转换成money
。从数据类型real
和double precision
的转换可以通过先转换成numeric
来实现SELECT '12.34'::float8::numeric::money;但是,我们不推荐这样做。浮点数不应该被用来处理货币,因为浮点数可能会有圆整错误。
一个
money
值可以在不损失精度的情况下被造型成numeric
。转换到其他类型可能会丢失精度,并且必须采用两个阶段完成:SELECT '52093.89'::money::numeric::float8;执行整数值对
money
值的除法时,将小数部分截断为零。 为了得到一个四舍五入的结果,除以一个浮点值,或者在除法计算之前将money
值转换为numeric
,然后返回到money
。 (倾向于后者,可以避免精确度损失的风险。) 当一个money
值被另一个money
值除时,结果是double precision
(即一个纯数字,而不是金额),在除法中货币单位被约掉了。
这里我们在存金额的时候,直接指定列的类型是money类型,存储的时候,会自动在前面增加货币符号,比如我存100.00数据库中会显示$100.00,其实这里我觉得和numeric类型的差别不大
2.JSON类型
SON 数据类型是用来存储 JSON(JavaScript Object Notation) 数据的。这种数据也可以被存储为
text
,但是 JSON 数据类型的 优势在于能强制要求每个被存储的值符合 JSON 规则。有两种 JSON 数据类型:
json
和jsonb
。它们 几乎接受完全相同的值集合作为输入。主要的实际区别之一是 效率。json
数据类型存储输入文本的精准拷贝,处理函数必须在每 次执行时必须重新解析该数据。而jsonb
数据被存储在一种分解好的 二进制格式中,它在输入时要稍慢一些,因为需要做附加的转换。但是jsonb
在处理时要快很多,因为不需要解析。jsonb
也支 持索引,这也是一个令人瞩目的优势。由于
json
类型存储的是输入文本的准确拷贝,其中可能会保留在语法 上不明显的、存在于记号之间的空格,还有 JSON 对象内部的键的顺序。还有, 如果一个值中的 JSON 对象包含同一个键超过一次,所有的键/值对都会被保留( 处理函数会把最后的值当作有效值)。相反,jsonb
不保留空格、不 保留对象键的顺序并且不保留重复的对象键。如果在输入中指定了重复的键,只有 最后一个值会被保留。通常,除非有特别特殊的需要(例如遗留的对象键顺序假设),大多数应用应该 更愿意把 JSON 数据存储为
jsonb
。PostgreSQL对每个数据库只允许一种 字符集编码。因此 JSON 类型不可能严格遵守 JSON 规范,除非数据库编码 是 UTF8。尝试直接包括数据库编码中无法表示的字符将会失败。反过来,能 在数据库编码中表示但是不在 UTF8 中的字符是被允许的。
直接看例子吧,比如我们数据库维护了一个字段,用来记录一周内店铺的开门和关门时间,如果不使用json我们可能会使用好几个字段去存
但是,我们现在可以这样
看我们查询周一开门的店铺
select * from recure_schedule where project_time::json->>'1' is not null;
执行结果如下,直接筛选出来了,是不是很惊喜~~~
其他的数据类型等用的时候在追加吧