postgresql浮点数函数_PostgreSQL教程(四):数据类型详
⼀、数值类型:
下⾯是PostgreSQL所⽀持的数值类型的列表和简单说明:
1. 整数类型:
类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有⼩数部分的数字。试图存储超出范围以外的数值将导致⼀个错误。常⽤的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。⼀般只有在磁盘空间紧张的时候才使⽤smallint。⽽只有在integer的范围不够的时候才使⽤bigint,因为前者(integer)绝对快得多。
2. 任意精度数值:
类型numeric可以存储最多1000位精度的数字并且准确地进⾏计算。因此⾮常适合⽤于货币⾦额和其它要求计算准确的数量。不
过,numeric类型上的算术运算⽐整数类型或者浮点数类型要慢很多。
numeric字段的最⼤精度和最⼤⽐例都是可以配置的。要声明⼀个类型为numeric的字段,你可以⽤下⾯的语法:
NUMERIC(precision,scale)
⽐如数字23.5141的精度为6,⽽刻度为4。
在⽬前的PostgreSQL版本中,decimal和numeric是等效的。
3. 浮点数类型:
数据类型real和double是不准确的、牺牲精度的数字类型。不准确意味着⼀些数值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储后再把数据打印出来可能显⽰⼀些缺失。
4. Serial(序号)类型:    serial和bigserial类型不是真正的类型,只是为在表中设置唯⼀标识做的概念上的便利。
CREATE TABLE tablename (
colname SERIAL
)
;
等价于
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename(
colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL
);
这样,我们就创建了⼀个整数字段并且把它的缺省数值安排为从⼀个序列发⽣器取值。应⽤了⼀个NOT NULL约束以确保空值不会被插⼊。在⼤多数情况下你可能还希望附加⼀个UNIQUE或者PRIMARY KEY约束避免意外地插⼊重复的数值,但这个不是⾃动发⽣的。因此,如果你希望⼀个序列字段有⼀个唯⼀约束或者⼀个主键,那么你现在必须声明,就像其它数据类型⼀样。
还需要另外说明的是,⼀个serial类型创建的序列在其所属字段被删除时,该序列也将被⾃动删除,但是其它情况下是不会被删除的。因此,如果你想⽤同⼀个序列发⽣器同时给⼏个字段提供数据,那么就应该以独⽴对象的⽅式创建该序列发⽣器。
⼆、字符类型:
下⾯是PostgreSQL所⽀持的字符类型的列表和简单说明:
SQL 定义了两种基本的字符类型,varchar(n)和char(n),这⾥的n是⼀个正整数。两种类型都可以存储最多n个字符长的字串,试图存储更长的字串到这些类型的字段⾥会产⽣⼀个错误,除⾮超出长度的字符都是空⽩,这种情况下该字串将被截断为最⼤长度。如果没有长度声明,char等于char(1),⽽varchar则可以接受任何长度的字串。
MyTest=> CREATE TABLE testtable(first_col varchar(2));
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES('333');  --插⼊字符串的长度,超过其字段定义的长度,因此报错。
ERROR:  value too long for type character varying(2)
--插⼊字符串中,超出字段定义长度的部分是空格,因此可以插⼊,但是空⽩符被截断。
MyTest=> INSERT INTO testtable VALUES('33 ');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
first_col
-----------
33
(1 row)
这⾥需要注意的是,如果是将数值转换成char(n)或者varchar(n),那么超长的数值将被截断成n个字符,⽽不会抛出错误。
MyTest=> select 1234::varchar(2);
varchar
---------
12
(1 row)
最后需要提⽰的是,这三种类型之间没有性能差别,只不过是在使⽤char类型时增加了存储尺⼨。虽然在某些其它的数据库系统
⾥,char(n)有⼀定的性能优势,但在PostgreSQL⾥没有。在⼤多数情况下,应该使⽤text或者varchar。
三、⽇期/时间类型:
下⾯是PostgreSQL所⽀持的⽇期/时间类型的列表和简单说明:
1. ⽇期/时间输⼊:
任何⽇期或者时间的⽂本输⼊均需要由单引号包围,就象⼀个⽂本字符串⼀样。
1). ⽇期:
以下为合法的⽇期格式列表:
2). 时间:
decimal是整数数据类型以下为合法的时间格式列表:
3). 时间戳:
时间戳类型的有效输⼊由⼀个⽇期和时间的联接组成,后⾯跟着⼀个可选的时区。因此,1999-01-08 04:05:06和1999-01-08
04:05:06 -8:00都是有效的数值。
2. ⽰例:
1). 在插⼊数据之前先查看datestyle系统变量的值:
MyTest=> show datestyle;
DateStyle
-----------
ISO, YMD
(1 row)
2). 创建包含⽇期、时间和时间戳类型的⽰例表:
MyTest=> CREATE TABLE testtable (id integer, date_col date, time_col time, timestamp_col timestamp); CREATE TABLE
3). 插⼊数据:
MyTest=> INSERT INTO testtable(id,date_col) VALUES(1, DATE'01/02/03');  --datestyle为YMD
INSERT 0 1
MyTest=> SELECT id, date_col FROM testtable;
id  |  date_col
----+------------
1  | 2001-02-03
(1 row)
MyTest=> set datestyle = MDY;
SET
MyTest=> INSERT INTO testtable(id,date_col) VALUES(2, DATE'01/02/03');  --datestyle为MDY
INSERT 0 1
MyTest=> SELECT id,date_col FROM testtable;
id  |  date_col
----+------------
1  | 2001-02-03
2  | 2003-01-02
MyTest=> INSERT INTO testtable(id,time_col) VALUES(3, TIME'10:20:00');  --插⼊时间。
INSERT 0 1
MyTest=> SELECT id,time_col FROM testtable WHERE time_col IS NOT NULL;
id  | time_col
----+----------
3  | 10:20:00
(1 row)
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(4, DATE'01/02/03');
INSERT 0 1
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(5, TIMESTAMP'01/02/03 10:20:00');
INSERT 0 1
MyTest=> SELECT id,timestamp_col FROM testtable WHERE timestamp_col IS NOT NULL;
id  |    timestamp_col
----+---------------------
4  | 2003-01-02 00:00:00
5  | 2003-01-02 10:20:00
(2 rows)
四、布尔类型:
PostgreSQL⽀持标准的SQL boolean数据类型。boolean只能有两个状态之⼀:真(True)或 假(False)。该类型占⽤1个字节。"真"值的有效⽂本值是:
TRUE
't'
'true'
'y'
'yes'
'1'
⽽对于"假"⽽⾔,你可以使⽤下⾯这些:
FALSE
'f'
'false'
'n'
'no'
'0'
见如下使⽤⽅式:
MyTest=> CREATE TABLE testtable (a boolean, b text);
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES(TRUE, 'sic est');
INSERT 0 1
MyTest=> INSERT INTO testtable VALUES(FALSE, 'non est');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
a  |    b
---+---------
t  | sic est
f  | non est
(2 rows)
MyTest=> SELECT * FROM testtable WHERE a;
a  |    b
-
--+---------
t  | sic est
(1 row)
MyTest=> SELECT * FROM testtable WHERE a = true;
a  |    b
---+---------
t  | sic est
(1 row)
五、位串类型:
位串就是⼀串1和0的字串。它们可以⽤于存储和视觉化位掩码。我们有两种类型的SQL位类型:bit(n)和bit varying(n); 这⾥的n是⼀个正整数。bit类型的数据必须准确匹配长度n; 试图存储短些或者长⼀些的数据都是错误的。类型bit varying数据是最长n的变长类型;更长的串会被拒绝。写⼀个没有长度的b
it等效于bit(1),没有长度的bit varying相当于没有长度限制。
针对该类型,最后需要提醒的是,如果我们明确地把⼀个位串值转换成bit(n),那么它的右边将被截断或者在右边补齐零,直到刚好n位,⽽不会抛出任何错误。类似地,如果我们明确地把⼀个位串数值转换成bit varying(n),如果它超过n位,那么它的右边将被截断。 见如下具体使⽤⽅式:
MyTest=> CREATE TABLE testtable (a bit(3), b bit varying(5));
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES (B'101', B'00');
INSERT 0 1
MyTest=> INSERT INTO testtable VALUES (B'10', B'101');
ERROR:  bit string length 2 does not match type bit(3)
MyTest=> INSERT INTO testtable VALUES (B'10'::bit(3), B'101');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
a  |  b
-----+-----
101 | 00
100 | 101

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。