Postgresql
如何避免 PostgreSQL 中的隱式類型轉換?
我剛剛發現我可以將任何類型的值插入到類型為 PostgreSQL (9.6) 的列中
text
:drop table if exists d cascade; create table d ( a text ); insert into d values ( 42 ); insert into d values ( true ); select a, pg_typeof( a ) from d; a | pg_typeof ------+----------- 42 | text true | text (2 rows)
這是故意的功能嗎?我做錯了什麼嗎?有沒有設置可以避免這種情況?這不違反 RDBMS 應該是類型安全的假設嗎?
我知道這
text
在 PostgreSQL 中就像一個包羅萬象的東西,這通常很方便,因為你可以編寫任意類型的字元串表示。但有時你肯定想確保只有字元串被插入到給定的列中,以排除隱式轉換值。我能做些什麼來避免“隨意”的類型轉換嗎?
- >
這是故意的功能嗎?
是的,隱式類型轉換是一個有意的功能。無論哪種方式都有利有弊,但這就是 postgres的工作方式:
在許多情況下,使用者不需要了解類型轉換機制的細節。但是,PostgreSQL 完成的隱式轉換會影響查詢的結果。必要時,可以使用顯式類型轉換來定制這些結果
- >
這不違反 RDBMS 應該是類型安全的假設嗎?
不,一切仍然是類型安全的,並且“SQL 是一種強類型語言”。隱式轉換不會改變這一點。
- >
我能做些什麼來避免“隨意”的類型轉換嗎?
沒有弄亂系統目錄,這通常是一個非常糟糕的主意(在某些情況下是不可能的),你可以做很多事情來完全避免隱式轉換。即使您在任何地方都包含顯式轉換,隱式轉換仍然可能會錯誤地發生:
create table t(foo text); insert into t(foo) values(11::integer);
select * from t;
| 富 | | :-- | | 11 |
dbfiddle在這裡