Postgresql

如何避免 PostgreSQL 中的隱式類型轉換?

  • January 10, 2018

我剛剛發現我可以將任何類型的值插入到類型為 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在這裡

引用自:https://dba.stackexchange.com/questions/194975