postgresql数字类型

postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种:

l  数字数据类型

l  字符串数据类型

l  日期/时间数据类型

数字数据类型

数字数据类型用于指定表中的数字数据,详情如下表所示:


名称


描述


存储大小


范围


smallint


存储整数,小范围


2字节


-32768
至 +32767


integer


存储整数。使用这个类型可存储典型的整数


4字节


-2147483648
至 +2147483647


bigint


存储整数,大范围。


8字节


-9223372036854775808
至 9223372036854775807


decimal


用户指定的精度,精确


变量


小数点前最多为131072个数字; 小数点后最多为16383个数字。


numeric


用户指定的精度,精确


变量


小数点前最多为131072个数字; 小数点后最多为16383个数字。


real


可变精度,不精确


4字节


6位数字精度


double
precision


可变精度,不精确


8字节


15位数字精度


smallserial


自动递增的小整数


2字节


1至32767


serial


自动递增整数


4字节


1
至 2147483647


bigserial


大的自动递增整数


8字节


1
至 9223372036854775807

数字类型又可以分为四类

1.  整数类型

类型smallint、integer、bigint只能保存整数,也就是没有小数部分。如果试图在整数类型中保存超过范围的整数,数据库将会报错。例:

mydb=#
INSERT into test VALUES(32767);

INSERT 0 1

mydb=# INSERT
into test VALUES(32768);

ERROR:  smallint out of
range

mydb=#
SELECT * from test;

smallint1

-----------

32767

(1 row)

2.  任意精度数值

numeric类型最多能存储有1000个数字位的数字并且能进行准确的数值计算。它主要用于需要准确地表示数字的场合,如货币金额。不过,对numeric 类型进行算术运算比整数类型和浮点类型要慢很多。

numeric类型有两个术语,分别是标度和精度。numeric类型的标度(scale)是到小数点右边所有小数位的个数, numeric 的精度(precision)是所有数字位的个数,例如,23.5141 的精度是6而标度为4。可以认为整数的标度是零。

numeric 类型的最大精度和最大标度都是可以配置的。可以用下面的语法定义一个numeric类型:

a)      NUMERIC(precision,
scale)

b)      NUMERIC(precision)

c)      NUMERIC

精度必须为正数,标度可以为零或正数。在上面的第二种语法中没有指定标度,则系统会将标度设为0,所以NUMERIC(precision,0)和NUMERIC(precision)是等价的。第三种类型的语法没有指定精度和标度,则这种类型的列可以接受任意精度和标度的numeric数据(在系统能表示的最大精度范围内),而不会对输入的数据进行精度或标度的变换。如果一个列被定义成numeric类型而且指定了标度,那么输入的数据将被强制转换成这个标度(如果它的标度比定义列的numeric的标度大),进行标度转换时的规则是四舍五入。如果输入的数据进行标度转换后得到的数据在小数点左边的数据位的个数超过了列的类型的精度减去标度的差,系统将会报错。例:

--构建环境

CREATE TABLE test
(numeric1 numeric(3,3));

--插入超过精度和标度的值

INSERT into test VALUES(1.3456);

--报错信息

ERROR:  numeric field overflow

DETAIL:  A field with precision 3, scale 3 must round
to an absolute value less than 1.

--插入超过标度的值,超过标度的部分被四舍五入成小于1的数。

INSERT into test VALUES(0.3455);

INSERT into test VALUES(0.3454);

SELECT * from test;

numeric1

----------

0.346

0.345

numeric 类型可以接受一个特殊的值 “NaN” (Not a Number),它的意思是“不是一个数字"。任何在 NaN 上面的操作都生成另外一个 NaN。 如果在 SQL 命令里把这些值当作一个常量写,必须把它用单引号引起来,比如 UPDATE
table SET x = ‘NaN‘。在输入时,”NaN”的大小写无关紧要。例:

INSERT into test
values(‘NaN‘);

SELECT * from test;

numeric1

----------

0.346

0.345

NaN

注意:在其它的数据库中,NaN和任何的数值数据都不相等,两个NaN也是不相等的,在postgresSQL中,为了允许numeric值可以被排序和使用基于树的索引,PostgreSQL把NaN值视为相等,并且比所有非NaN值都要大。例:

SELECT * from test
where numeric1=‘NaN‘;

numeric1

----------

NaN

SELECT * from test t1,test t2 where t1.numeric1=t2.numeric1;

numeric1 | numeric1

----------+----------

0.345 |    0.345

0.346 |    0.346

NaN |     
NaN

SELECT * from test where
NUMERIC1>10;

numeric1

----------

NaN

3.  浮点类型

数据类型 real 和 double precision 表示不准确的变精度的数字。不准确意味着一些值不能准确地转换成内部格式并且是以近似的形式存储的,存储在数据库里的只是它们的近似值。如果要求准确地保存某些数值(比如计算货币金额),应使用 numeric 类型。另外,比较两个浮点数是否相等时,可能会得到意想不到的结果。例:

create table test(real1
real)

insert into test VALUES(1.6666666);

insert into test VALUES(1.666666);

insert into test VALUES(1.66666);

SELECT * FROM test;

real1

---------

1.66667

1.66667

1.66666

(3 rows)

mydb=# SELECT * from test
where real1=1.66666;            --等值运算未能获取到想要的数据

real1

-------

(0 rows)

mydb=# SELECT * from test
where real1=1.66667;           --等值运算未能获取到想要的数据

real1

-------

(0 rows)

mydb=# SELECT * from test
where real1>1.66666;

real1

---------

1.66667

1.66667

(2 rows)

mydb=# SELECT * from test
where real1>1.6666;

real1

---------

1.66667

1.66667

1.66666

(3 rows)

浮点类型还有几个特殊值:Infinity、-Infinity、NaN。这些值分别表示 IEEE 754标准中的特殊值"正无穷大","负无穷大",
以及"不是一个数字"。如果在 SQL 命令里把这些数值当作常量写,必须在它们用单引号引起来,例如UPDATE table SET x =
‘Infinity‘。 输入时,这些值的大小写无关紧要。

PostgreSQL 还支持 SQL 标准中定义的类型float和float(p)。p 定义以二进制位表示的最低可以接受的精度,p的取值在1到53之间。实际上,如果p的取值在1到24之间,float(p)被看成是real类型,如果p的取值在25到53之间,float(p)被看成是double precision类型。不带精度的float被看成是double precision类型。

4.  Postgresql的序列

Postgresql中的序列作为数据类型存在,smallserial、serial和bigserial并不是真正的类型,只是为了创建唯一标识符而存在的符号。

创建序列的两种方式

1、直接在表中指定字段类型为smallserial、serial和bigserial。

CREATE table test(text
varchar,serial1 serial);

INSERT into test VALUES(‘一‘);

INSERT into test VALUES(‘二‘);

INSERT into test VALUES(‘三‘);

INSERT into test VALUES(‘四‘);

mydb=# Select * from test;

text | serial1

------+---------

一   |      
1

二   |      
2

三   |      
3

四   |      
4

(4 rows)

2、先创建序列名称,然后在新建表中指定相关列的属性,该列需要int类型。

序列创建语法

CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]

[ MINVALUE minvalue | NO MINVALUE ] [
MAXVALUE maxvalue | NO MAXVALUE ]

[ START [ WITH ] start ] [ CACHE cache
] [ [ NO ] CYCLE ]

[ OWNED BY { table.column | NONE } ]

例:

--创建一个步长为10,最小值为1,初始值为17,缓存为100,可循环的使用的序列

create sequence test_id_seq
increment by 10 minvalue 1 no maxvalue
start with 17 cache 100 
cycle;

--查看序列的属性,两种方式,使用psql中\d查看,或直接查询序列名称

mydb=# \d test_id_seq

Sequence "public.test_id_seq"

Column     |  Type  
|        Value

---------------+---------+---------------------

sequence_name |
name    | test_id_seq

last_value    | bigint  | 17

start_value     | bigint  | 17

increment_by | bigint  | 10

max_value     | bigint  | 9223372036854775807

min_value      | bigint  | 1

cache_value  | bigint  | 100

log_cnt           | bigint  | 0

is_cycled        | boolean | t

is_called         | boolean | f

mydb=# SELECT * from test_id_seq;

sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called

---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------

test_id_seq   |      
1007 |          17 |           10 | 9223372036854775807 |         1 |         100 |      32 | t         | t

(1 row)

--创建一个使用上述序列的表

create table test(wenzi varchar,id int4 not null
DEFAULT nextval(‘test_id_seq‘));

--为表中不使用序列的列插入数据

INSERT into test VALUES(‘一‘);

INSERT into test VALUES(‘二‘);

INSERT into test VALUES(‘三‘);

INSERT into test VALUES(‘四‘);

--查询插入后的数据

mydb=# select * from test;

wenzi | id

-------+----

一   
| 17

二    | 27

三    | 37

四    | 47

(4 rows)

时间: 2024-10-24 20:31:03

postgresql数字类型的相关文章

python的数字类型学习之数据类型

1.在python中,数字并不是一个真正的对象类型,而是一组类似类型的分类.它支持通常的数字类型,还能够可以通过常量直接创建数字,还可以处理数字表达式. 2.数字常量: (1)整数和浮点数常量 (2)16进制.8进制.2进制常量 (3)复数: 写法:实部+虚部 通过内置函数complex(real,imag)创建复数 3.运算操作符的优先级: (1)混合操作: 表达式操作符的优先级(从低到高) 生成器函数发送协议 生成匿名函数 三元选择表达式 逻辑或 逻辑与 逻辑非 成员关系 对象实体测试 大小

javascript中字符串向数字类型的自动转换

js中类型的转换依环境而定,当字符串向数字类型(浮点)转换时,有几种情况: 1.加号连接符引导为字符拼接: console.log("2"+1); 21 console.log(1+"2"+1); 121 2.其余情况引导为数字计算: console.log(0-"2"+1); -1 console.log("2"*2); 4 console.log(1*"2"+1); 3 3.当字符串带非数字时返回NaN

python之数字类型

1. 支持类型 python支持多种数字类型:整形,长整型,布尔型,双精度浮点型,十进制浮点型,复数注意:给数字对象重新赋值,实际上并没有更新该对象的原始数字(数字对象immutable),只是重新生成一个新的数值对象,并指向它. 复数 >>> aComplex = -3.1-4.2j >>> aComplex (-3.1-4.2j) >>> aComplex.real -3.1 >>> aComplex.imag -4.2 >

数据类型转换(针对数字类型)

1.            分为2大类:        数字类型(int.double). 非数字类型(字符' '.字符串"".布尔类型boolean) 2.            数据类型转换分类 a)        自动类型转换                          i.              规则1:如果一个操作数为double类型,则整个表达式可提升为double类型                        ii.              规则2:满足自

python第二周 数字类型

数字类型 Python中,数字并不是一个真正的对象类型,而是一组类似类型的分类.Python不仅支持通常的数字类型(整数和浮点数),而且能够通过常量去直接创建数字以及处理数字的表达式,还通过模块和第三方库提供更多的数字类型支持.Python数字类型的完整工具包括: 整数和浮点数 复数(需要模块支持) 固定精度的十进制数 有理分数 集合 布尔类型 无穷的整数精度 各种数字内置函数和模块 处理数字对象的工具: 表达式操作符:+.-.*././/.>>.**.& 内置数学函数:pow.abs

DecimalFormat格式化输出带小数的数字类型

刚开始 double d = 333333333.333333333; System.out.println(d); 输出结果为3.333333333333333E8 网上找到了DecimalFormat对象 double d = 333333333.333333333; DecimalFormat decimalFormat = new DecimalFormat("#.#"); System.out.println(decimalFormat.format(d)); 结果为3333

#定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。

1 #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). 2 def get_num(num): 3 if type(num)!= list: 4 return '您传入的不是列表!' 5 else: 6 for i in num: 7 if not isinstance(i,int): 8 return '请全部传入整数!' 9 return list(filter(lambda x:x

ACCESS常用数字类型的说明和取值范围

下面是ACCESS常用数字类型的说明和取值范围列表明供参考 数字类型                 范围 Byte(字节)            介于 0 到 255 之间的整型数. Integer(整型)          介于 –32,768 到 32,767 的短整型数. Long(长整型)         介于 –2,147,483,648 到 2,147,483,647 的长整型数. Currency(货币)      介于-922,337,203,685,477.5808 到 92

postgresql 数组类型初步实践

实践环境 数据库:postgresql 9.4:操作系统:windows 创建包含数组类型的数据库 注意在设置default 值时(当然你可以不指定默认值),要声明数组的类型,像这样声明"::bigint[]". create table testarray( id serial primary key, images bigint[] default array[]::bigint[] ); 插入数组值 注意插入数组时,也要声明数组的类型,同上 insert into testarr