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數據類型比較多,一些不常見的類型其實自己試驗一下就知道了。 

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