4.pgsql各数据类型测试

#############################1.数字类型测试###############################
insert into t_num_test values(1,2,12,3.141592653);
-- 四舍五入到3.15
insert into t_num_test values(1,2,12,3.149592653);
-- decimal类型不存在,猜测为pgsql内部使用
-- 报错:精度为3,范围是2的字段必须四舍五入到小于10^1的绝对值.
insert into t_num_test values(1,2,12,43.159592653);
-- 插入real(结果显示为3.14159,说明real为变精度为6)
insert into t_num_test values(1,2,12,3.14,3.141592653);
-- 插入double precision(结果显示为3.11111222223333,说明double precision为变精度15)
insert into t_num_test values(1,2,12,3.14,3334445.141592653,333333.111112222233333444445555566666);
-- pgsql插入还可以不声明字段直接插入,其他默认为null或者自增值(这种写法在其他数据库上面会报错)
insert into t_num_test values(1);
insert into t_num_test(real) values(11.22);
insert into t_num_test(serial) values(-100);
-- smallserial和serial和bigserial类似于mysql中的自增auto_increment,但是有不同
-- pgsql中自增值不是unique的,而且自增只会记录pgsql自己的值,与外部插入指无关。
-- 而且pgsql的自增不能为负数,因此
insert into t_num_test(smallserial) values(-32000);
-- money 类型现在已经废弃,用 numeric 或 decimal 以及 to_char 函数一起使用就可以取代它。
-- 但是money类型还是可以使用(结果为:¥355.27)
insert into t_num_test(money) values(355.265);

select * from t_num_test order by smallserial desc;

#############################2.字符类型测试###############################
insert into t_char_test(character) values('leidagou');
insert into t_char_test values('lei','leidagou_leidagou'::varchar(2),'leidagou_leidagou');

select length(character) from t_char_test;
select * from t_char_test;
CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
-- 这种情况只会保留最后的一个空格(插入成功)
INSERT INTO test2 VALUES ('good      ');
-- 插入失败
INSERT INTO test2 VALUES ('     good');
-- 9
select char_length('     good');
-- 9
select char_length('good     ');
INSERT INTO test2 VALUES ('too long');
insert into t_char_test values('lei','da','gou','lei','gou');
-- name 类型只用于在内部系统表中存储标识符并且不是给一般用户使用的。该类型长度当前定为 64 字节(
-- 63 可用字符加结束符)但应该使用常量 NAMEDATALEN 引用。这个长度是在编译的时候设置的,因而可以为特殊用途调整,缺省的最大长度在以后的版本可能会改变。
-- 类型 "char"(注意引号)和 char(1) 是不一样的,它只用了一个字节的存储空间。它在系统内部用于系统表当做穷人的枚举类型用。
-- 测试了下,发现pgsql没有enum类型,而是用的"char"代替
select * from t_char_test;

#############################3.二进制数据类型测试###############################
insert into t_byte_test values(E'\\000');
SELECT E'\\000'::bytea;

select * from t_byte_test;

#############################4.日期/时间类型测试###############################
insert into t_date_test values('1999-01-08');
insert into t_date_test values('January 8, 1999');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55','1999-01-08 12:55:59');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55','1999-01-08 12:55:59','1999-01-08 12:55:59');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55','1999-01-08 12:55:59','1999-01-08 12:55:59','3601');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55','1999-01-08 12:55:59','1999-01-08 12:55:59','3601','2020/2/12 10:21:25');
insert into t_date_test values('1999-01-08 12:55:32','1999-01-08 12:55:59','12:55','1999-01-08 12:55:59','1999-01-08 12:55:59','3601','2020/2/12 10:21:25','2020/2/12 10:21:25');
insert into t_date_test(date_range) values('[2020/2/12 10:21:25,2020/2/12 10:21:25]');
insert into t_date_test(date_range) values('[2020-1-15,today]');

select * from t_date_test;


#############################5.boolean类型测试###############################
-- boolean 使用 1 字节存储空间。
CREATE TABLE t_boolean_test (a boolean, b text);
INSERT INTO t_boolean_test VALUES (TRUE, 'sic est');
INSERT INTO t_boolean_test VALUES (FALSE, 'non est');
INSERT INTO t_boolean_test VALUES ('1', 'lei');
INSERT INTO t_boolean_test VALUES ('0', 'lei');
INSERT INTO t_boolean_test VALUES ('t', 'lei');
INSERT INTO t_boolean_test VALUES ('f', 'lei');
INSERT INTO t_boolean_test VALUES ('n', 'lei');
INSERT INTO t_boolean_test VALUES ('y', 'lei');
INSERT INTO t_boolean_test VALUES ('yes', 'lei');
INSERT INTO t_boolean_test VALUES ('no', 'lei');

SELECT * FROM t_boolean_test;

#############################6.几何类型测试###############################
insert into t_geo_test values('(1,2)');
insert into t_geo_test values('(1,2)'::point);
INSERT INTO public.tablename(geometry) VALUES ('LINE(120.163629 30.2592077,120.163599 30.259802,120.163617 30.259803,120.163647 30.259207)');
insert into t_geo_test(line) values('((1.25,2.35),(3.12,4.96))'::line);

select * from t_geo_test;

#############################7.网络地址类型测试###############################
-- inet 和 cidr 类型之间的基本区别是 inet 接受子网掩码,而 cidr 不接受。强行输入会报错。
-- 【提示】如果你不喜欢 inet 或 cidr 值的输出格式,请试一下 host, text, abbrev 函数。
-- cidr 保存一个 IPv4 或 IPv6 网络地址。其输入和输出遵循无类别的互联网域路由习惯。声明一个网络的格式是 address/y ,这里的 address 是 IPv4 或者 IPv6 地址,y 是子网掩码的二进制位数
create table t_net_test(
    inet inet,
    cidr cidr,
    macaddr macaddr
);
insert into t_net_test values('192.168.0.103/23','192.168.0.103','08002b:010203');
insert into t_net_test values(host('192.168.0.103/23'),'192.168.0.103','08002b:010203');


select * from t_net_test;

#############################8.位串类型测试###############################
CREATE TABLE test (a BIT(3), b BIT VARYING(5));
INSERT INTO test VALUES (B'101', B'00');
INSERT INTO test VALUES ('101', '00');
INSERT INTO test VALUES (B'10', B'101'); -- ERROR:  错误:  bit字符串的长度(2)与bit类型(3)不匹配.
INSERT INTO test VALUES (B'10'::bit(3), B'101');
SELECT * FROM test;

#############################9.数组类型测试###############################
drop table t_array_test
create table t_array_test(
    int_arr integer[],
    varchar_arr varchar[],
    varchar_arr2 varchar[][] -- 虽然可以定义成多维数组的形式,实际还是一位数组类型
)
insert into t_array_test values('{1,2,3}','{"lei","da","gou"}','{"lei","da","gou"}');
insert into t_array_test values('{{1,2},{1,2,3}}','{"lei","da","gou"}','{"lei","da","gou"}');-- 报错:  多维数组必须有具有匹配维度的子数组,子数组中元素个数相同
insert into t_array_test values('{{1,2,2},{1,2,3}}','{"lei","da","gou"}','{"lei","da","gou"}');

-- 在数组中检索
select * from t_array_test where int_arr[1]=1

select * from t_array_test;

#############################10.复合类型测试###############################
create type user_type as(
    user_name integer,
    pass_word varchar(50)
)
create table t_test_type(
    aa user_type,
    bb integer
)
insert into t_test_type values('(2,"password")',11);
insert into t_test_type values('(22,"password2")',112);
-- 检索复合字段中的单个字段需要使用小括号
select (aa).pass_word from t_test_type;

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

#############################11. 伪类型测试###############################
-- PostgreSQL类型系统包含一系列特殊用途的条目,它们按照类别来说叫做伪类型。伪类型不能作为字段的数据类型,
-- 但是它可以用于声明一个函数的参数或者结果类型。伪类型在一个函数不只是简单地接受并返回某种 SQL 数据类型的情况下很有用。

#############################12. XML文档类型测试###############################
-- XML(可扩展标记语言)支持不是一种单一的能力,而是需要数据库系统支持一系列的特性,
-- 包括存储、导入/导出、验证、索引、修改、搜索、转换、XML 到 SQL 映射,PostgreSQL 只支持其中的一部分,
-- 未来的版本将提供更多的 XML 支持。

#############################13. json类型测试###############################
insert into t_json_test values('{"aaa":"bbb"}');
select * from t_json_test;
 

总结:pgsql数据类型比较多,一些不常见的类型其实自己试验一下就知道了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章