当前位置:   article > 正文

postgresql 数据类型_postgresql中数据类型及案例

postgresql中数据类型及案例
smallint2字节-32768 to +32767
integer4字节-2147483648 to +2147483647
bigint8字节-9223372036854775808 to +9223372036854775807
decimal可变最高小数点前131072位,以及小数点后16383位
numeric可变最高小数点前131072位,以及小数点后16383位
real4字节6位十进制精度
double precision8字节15位十进制精度
smallserial2字节1到32767
serial4字节1到2147483647
bigserial8字节1到9223372036854775807

整数

smallint、integer(或者int)、bigint。对应的扩展是int2、int4、int8

  1. db=# create table demo_int(
  2. db(# int2 int2,
  3. db(# int4 int4,
  4. db(# int8 int8,
  5. db(# smallint smallint,
  6. db(# integer integer,
  7. db(# bigint bigint);
  8. db=# insert into demo_int values (248248)
  9. ;
  10. INSERT 0 1
  11. db=select * from demo_int;
  12.  int2 | int4 | int8 | smallint | integer | bigint
  13. ------+------+------+----------+---------+--------
  14.     2 |    4 |    8 |          |         |
  15.     2 |    4 |    8 |        2 |       4 |      8

定点数

numeric类型,这个用法如下,该类型是用在对于精确描述的数字上面,比如货币金额

numeric(precision, scale)
numeric(precision)
numeric

说明:
precision:精度,就是小数点的左右共有多少个数字
scale:刻度,就是小数点的右边有多少个数字
比如:
number(3,2):表示的就是2.12
number(3):表示的就可以是整数:123
number:表示的就不限制了:1233,432, 2212876

注意:
1.虽然该类型功能看着很牛逼,但是该值进行计算的时候,要比整数和浮点数慢得多
2.该类型同decimal是同效的,两个都是sql规范中要求的
3.其中插入的时候是有限制的,整数部分的位数一定要小于等于precision-scale。否则就会失败,不过小数部分插入时候不关心,但是显示的时候就有区别了

  1. -- 创建表
  2. create table demo_numeric(num numeric(2,3));
  3. -- 插入 OK
  4. insert into demo_numeric values(12.3);
  5. insert into demo_numeric values(12.332);
  6. insert into demo_numeric values(1.332123123123);
  7. -- 插入 异常
  8. insert into demo_numeric values(123.332);

4.该类型还支持NaN,但是使用的时候要添加上'',这样的一个引号才行

浮点数

浮点数这里有这么几种类型:
real
double precision
float(p)
float4
float8

real

这个跟float4是等价的

  1. db=# create table demo_real(
  2. db(# real real);
  3. CREATE TABLE
  4. db=# insert into demo_real values(12.323);
  5. INSERT 0 1
  6. db=# insert into demo_real values(17879234.323);
  7. INSERT 0 1
  8. db=select * from demo_real;
  9.      real
  10. ---------------
  11.         12.323
  12.  1.7879234e+07
double precision

这个跟float8是等价的

  1. db=# create table demo_double(
  2. db(# double double precision);
  3. CREATE TABLE
  4. db=# insert into demo_double values(123.123123);
  5. INSERT 0 1
  6. db=# insert into demo_double values(123.123123879987);
  7. INSERT 0 1
  8. db=select * from demo_double;
  9.       double
  10. ------------------
  11.        123.123123
  12.  123.123123879987
float

这个跟double precision是等价的

  1. db=# create table demo_float(
  2. db(# float float);
  3. CREATE TABLE
  4. db=# insert into demo_float values(123.3123);
  5. INSERT 0 1
  6. db=# insert into demo_float values(123.312808981233);
  7. INSERT 0 1
  8. db=# create table demo_float_n(
  9. db(# float float4);
  10. CREATE TABLE
  11. db=# insert into demo_float_n values(1.333);
  12. INSERT 0 1

发现上面三种类型都可以表示不定点的精度数(也叫浮点数),那么有什么区别呢
real:这个跟float(p)中的p在1~24是一样的,其实也有别名是:float4
double precision:这个是float(p)中的p为24~53,其实也有别名:float8

其中float(p)中的p不是表示小数点后面有多少个数,而是表示的当前这个小数可以用多少个bit表示,说是在pg中这个没有什么意义,其中用类型表示

  1. db=select pg_typeof(1.33333::float(1));
  2.  pg_typeof
  3. -----------
  4.  real
  5. (1 row)
  6. db=select pg_typeof(1.33333::float(24));
  7.  pg_typeof
  8. -----------
  9.  real
  10. (1 row)
  11. db=select pg_typeof(1.33333::float(25));
  12.     pg_typeof
  13. ------------------
  14.  double precision
  15. (1 row)
  16. db=select pg_typeof(1.33333::float(53));
  17.     pg_typeof
  18. ------------------
  19.  double precision
  20. (1 row)
  21. db=select pg_typeof(1.33333::float(54));
  22. ERROR:  precision for type float must be less than 54 bits
  23. LINE 1select pg_typeof(1.3)
  24. -- 其中float4就是real
  25. db=select pg_typeof(1.33333::float4);
  26.  pg_typeof
  27. -----------
  28.  real
  29. (1 row)
  30. db=select pg_typeof(1.33333::float8);
  31.     pg_typeof
  32. ------------------
  33.  double precision
  34. (1 row)

其中默认的float,如果没有指定点数,则float表示的数就是double precision

注意:
浮点数如果插入的数据比表示的范围大,则会产生圆整错误

序列类型

这里有这么几种类型
smallserial:等效serial2
serial:等效serial4
bigserial:等效serial8
serial2
serial4
serial8

smallserial
serial
bigserial
类型不是真正的类型,它们只是为了创建唯一标识符列而存在的方便符号(类似其它一些数据库中支持的AUTO_INCREMENT
属性)。这个只是一个简化写法而已

  1. db=# create table demo_serial(
  2. db(# se serial,
  3. db(# int int);
  4. CREATE TABLE
  5. db=# insert into demo_serial(int) values (22);
  6. INSERT 0 1
  7. db=# insert into demo_serial(int) values (22);
  8. INSERT 0 1
  9. db=# insert into demo_serial(int) values (22);
  10. INSERT 0 1
  11. db=# insert into demo_serial(int) values (22);
  12. INSERT 0 1
  13. db=select * from demo_serial;
  14.  se | int
  15. ----+-----
  16.   1 |  22
  17.   2 |  22
  18.   3 |  22
  19.   4 |  22
  20. (4 rows)

货币类型

money类型存储固定小数精度的货币数字,在我们自己的金钱中,小数点后面是有两位的(元.角分)。小数的精度由数据库的lc_monetary设置决定。表中展示的范围假设有两个小数位。可接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如'$1,000.00'。输出通常是最后一种形式,但和区域相关。

money,这个其实是专门用来表示货币的,是8字节,值的范围也是很大

名字存储尺寸描述范围
money8 bytes货币额-92233720368547758.08到+92233720368547758.07
  1. db=# create table demo_money(
  2. db(# money money);
  3. CREATE TABLE
  4. db=# insert into demo_money values(123.2312);
  5. INSERT 0 1
  6. db=# insert into demo_money values(123.23129808098);
  7. INSERT 0 1
  8. db=# insert into demo_money values(12376287348234.23);
  9. INSERT 0 1
  10. db=select * from demo_money;
  11.          money
  12. ------------------------
  13.                 $123.23
  14.                 $123.23
  15.  $12,376,287,348,234.23
  16. (3 rows)

也可以通过字符串的方式插入

  1. db=# insert into demo_money values('$12.09');
  2. INSERT 0 1
  3. db=select * from demo_money;
  4.          money
  5. ------------------------
  6.                 $123.23
  7.                 $123.23
  8.  $12,376,287,348,234.23
  9.                  $12.09
  10. (4 rows)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/399960
推荐阅读
相关标签
  

闽ICP备14008679号