問題描述:
數(shù)據(jù)庫是oracle 模式時(shí)又固,參數(shù)ora_input_emptystr_isnull=on是為了兼容oracle?對(duì)于‘’作為null處理诀紊。
分析與解決方法:
以下是oracle環(huán)境下锦溪,’’ 比較結(jié)果:
SQL> create table t1 (id integer, name char (9) ) ;Table created.SQL> insert into t1 values(1,'') ;1 row created.SQL> select * from t1 where name='' ;no rows selectedSQL> select * from t1 where name is null;ID NAME
同樣颤芬,開啟ora_input_emptystr_isnull參數(shù)后哩至,KES結(jié)果如下:
test-# create table t1 (id integer,name char(9)) ;CREATE TABLEtest=# insert into t1 values(1, '') ;INSERT 0 1test=# select * from t1 where name=' ' ;id | name---+-------(10 rows )test=# select * from t1 where name is null;id | namc---+--------1? |(1 row)test=# show database_mode;database_mode----------------oracle(1 row)
2.1.2.?判斷值是否為空捕虽,要用?is?null??
問題描述:
對(duì)于空值使用?=‘’ 返回結(jié)果與is null返回結(jié)果不同
test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull----------------------------on(1 row)
test=# create table t1 (id1 integer 幸海,id2 integer) ;
CREATE TABLEtest=# insert into t1 values (1, nul1) ;
INSERT 0 1
test=# insert into t1 values(2, '');
INSERT 0 1
test=# select * from t1 where id2 is null;
id1 | id2----+------1? |2? |
(2 rows)
test=# select * from t1 where id2='';id1? | id2-----+-----(0 rows)
分析與解決方法:
當(dāng)參數(shù)ora_input_emptystr_isnull=on時(shí)祟身,’’會(huì)轉(zhuǎn)換為null奥务,而null表示不確定的值,因此袜硫,NULL值比較只能是IS NULL或IS NOT NULL氯葬,不可以是= NULL?或<> NULL的的形式判斷,無論= NULL?或<> NULL父款,都是不成立的溢谤。
2.1.3.?PG模式下‘’值問題??
問題描述:
PG模式下,需要設(shè)置ora_input_emptystr_isnull=off憨攒,否則會(huì)有很多問題(因?yàn)檫@個(gè)參數(shù)本身就是為兼容oracle設(shè)置的世杀,必須在oracle模式下使用)。
分析與解決方法:
PG模式肝集,‘’行為如下:
test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull--------------------------off
(1 rows)
test=# select * from t1 where name='';
id | name---+-----1? |(1 rows)
test=# select * from t1 where name is null;
id | name---+-----
(0 rows)
test=# set ora_input_emptystr_isnull=on;
SET
test=# select * from t1 where name='';
id | name---+-----1? |(1 rows)
test=# select * from t1 where name is null;
id | name---+------(0 rows)
2.1.4.?Ora_input_emptystr_isnull對(duì)于字符類型空值的影響??
問題描述:
當(dāng)insert數(shù)據(jù)時(shí)瞻坝,對(duì)于空值可以是?‘’(中間沒有空格)或?null,不同參數(shù)值結(jié)果是不同的杏瞻,會(huì)影響后續(xù)的select訪問結(jié)果所刀。
分析與解決方法:
1)?ora_input_emptystr_isnull=on 插入的數(shù)據(jù),‘’和null都會(huì)轉(zhuǎn)為null捞挥,之后的select操作不管ora_input_emptystr_isnull為何值浮创,返回結(jié)果都相同:
test=# show ora_input_emptystr_isull; --在參數(shù)開啟的情況下insert數(shù)據(jù)ora_input_emptystr_isull-------------------------on(1 row)
test=# create table t1(id integer,name varchar(9));
CREATE TABLEtest=# insert into tl values(1,''); --沒有空格
INSERT 0 1
test=# insert into 1 values(2,null);
INSERT 0 1test=# select * from tl where name is nu11;
id |name---+------1? |2? |(2 rows)
test=# select * from t1 where name='';
id | name---+------(0 rows)
test=# set ora_input_emptystr_isull=off;?
--參數(shù)改為off, 不影響select結(jié)果SET
test=# select * from t1 where name is null;id? | name----+------1? |2? |(2 rows)test=# select * from t1 where name='';id? | name---+------(0 rows)
2)?在ora_input_emptystr_isnull=off時(shí)插入的數(shù)據(jù)砌函,ora_input_emptystr_isnull值不同斩披,返回的結(jié)果也不同:
test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull-------------------------off(1 row)
test=# create table t1 (id integer,name varchar(9));
CREATE TABLEtest=# insert intc t1 value(1,'');
INSERT 0 1
test=# insert inte tl values(2,null);
INSERT 0 1
test=# select * from t1 where name is null;
id | name---+-------2? |(1 row)
test=# select * trom tl where name='';
--與null不同id | name---+-------2? |(1 row)
test=# set ora_input_emptystr_isnull=on;
SET
test=# select * from t1 where name is null;
id | name---+------2? |(1 row)
test=# select * from t1 where name ''; --雖然開啟set ora_input_emptystr_isnull,對(duì)先前插入的數(shù)據(jù)無效id | name---+------(0 rows)
test=# select length(name) from t1 where id=1;
length--------0(1 row)
test=# select * from ti where name is not null;
id | name---+------1 |(1 row)
測(cè)試結(jié)論:數(shù)據(jù)內(nèi)部對(duì)于?‘’ 與?null值的存儲(chǔ)是不同的讹俊,當(dāng)ora_input_emptystr_isnull=on 時(shí)垦沉,不管的insert ‘’,?還是 where col=’’ 仍劈,’’ 都會(huì)轉(zhuǎn)為?null 厕倍,
2.1.5.?Ora_input_emptystr_isnull對(duì)于數(shù)值類型空值的影響??
問題描述:
對(duì)于integer類型數(shù)據(jù),當(dāng)ora_input_emptystr_isnull=off時(shí)贩疙,’’對(duì)于insert 或?select 都會(huì)因?yàn)轭愋娃D(zhuǎn)換問題報(bào)錯(cuò)讹弯。
分析與解決方法:
當(dāng)ora_input_emptystr_isnull=off時(shí),’’當(dāng)做字符串这溅,無法轉(zhuǎn)換成整型闸婴。當(dāng)ora_input_emptystr_isnull=on 時(shí),’’被轉(zhuǎn)成null芍躏,而null 沒有類型約束,所以轉(zhuǎn)換沒有問題降狠。
1)?當(dāng)ora_input_emptystr_isnull=on 对竣,insert 與?select 對(duì)于?‘’ 都沒問題
test=# show ora_input_emptystr_isnull;
ora_input_emptystr_isnull-------------------------on(1 row)
test=# create table t1 (id1 integer,id2 integer);
CREATE TABLE
test=# insert intc t1 value(1,null);
INSERT 0 1
test=# insert inte tl values(2,'');--可以insert ''INSERT 0 1
test=# select * from t1 where id2 is null;
id1 | id2----+-------1? |2? |(2 rows)
test=# select * trom tl where id2='';id1 | id2----+-------(0 row)
2)?當(dāng)ora_input_emptystr_isnull=off 庇楞,insert 與?select 對(duì)于?‘’都有問題
test=# show ora_input_emptystr_isnull;ora_input_emptystr_isnull-------------------------off(1 row)
test=# select * from t1 where id2 is null;?
?id1 | id2? ----+-------? 1? |? 2? |(2 rows)
test=# select * from t1 where id2='';--對(duì)于條件轉(zhuǎn)換有問題ERROR: invalid input syntax for type integer:""LINE 1:select * from tl where id2='';
test=# create table t1 (id1 integer,id2 integer);
CREATE TABLE
test=# insert intc t1 value(1,null);INSERT 0 1
test=# insert into tl values(2,'');-
-不可以insert ''ERROR: invalid input synlax for type integer:""LINE 1: insert into t1 values(2,'');