码农日记

薄洪涛的个人博客

PostgreSQL不常用很有用的数据类型

最近新项目开始,需要设计数据库,技术大佬用了很多我之前没见过的数据库数据类型,这里做个总结


1.货币类型

money类型存储固定小数精度的货币数字,表中展示的范围假设有两个小数位。可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如'$1,000.00'货币的类型由lc_monetary (string)设置用于格式化货币量的区域

image.png

数据类型numericintbigint的值可以被转换成money。从数据类型realdouble 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我们可能会使用好几个字段去存

但是,我们现在可以这样

image.png

看我们查询周一开门的店铺

select * from recure_schedule where project_time::json->>'1' is not null;

执行结果如下,直接筛选出来了,是不是很惊喜~~~

image.png

其他的数据类型等用的时候在追加吧


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处