不同数据库的空字符串处理逻辑
经历过不同数据库开发的人经常会对莫名其妙的空串处理逻辑搞的晕头转向。
本人在此对Oracle,MSSQL,Sybase三种数据库的空串处理逻辑所一点分析。
本文假设读者正在使用PL/SQL或者T-SQL。
1、ORACLE——PL/SQL
在PL/SQL中,空串与NULL被视为等价值。
以下是测试例子:
CREATE TABLE test_empty(name VARCHAR2(10) NOT NULL);
INSERT INTO test_empty VALUES('');
ORA-01400: cannot insert NULL into ("MY_DB"."TEST_EMPTY"."NAME")
因此,在PL/SQL中语句
IF v_name = '' THEN
实际上错误的。因为众所周知,判断是否为NULL应该用IS NULL。
那么,ORACLE中空串的长度是什么呢?
执行以下语句你将得到答案:
SELECT LENGTH('') from DUAL;
结果是0吗?不,是空值NULL!
这说明在Oracle不存在长度为0的字符串!
2、MSSQL——T-SQL
MSSQL真正将空串视为一个有意义的标识,即不是一个空值。
你可以顺利将空串插入一个NOT NULL的列中:
CREATE TABLE test_empty(name varchar(10) NOT NULL) ;
INSERT INTO test_empty VALUES('');
MSSQL将空串视作一个长度为0的字符串,与其他字符串没有本质区别。执行
SELECT LEN('')
其结果为0。
既然空串不是NULL,那么自然可以直接用=号进行判断。
3、Sybase
从直觉上讲,MSSQL脱胎于Sybase,因为两者的空串处理逻辑应该一样。但是实际并非如此。
与Oracle一样,Sybase中同样不存在长度为0的字符串,但是与Oracle不同的是,Sybase并不将空串视作NULL,而是视作与只包含一个空格的字符串等价。
因此,执行
SELECT LEN('') SELECT LEN(' ')
以上其结果居然是1!
这个逻辑引起的最大麻烦是在字符串相加时,引起头或尾部不必要的空格,导致相关逻辑失败!
原来是自己习惯了SQLServer的处理方式。
-------------------------------------------------------------------------------------
Adaptive Server 将空字符串常量自动转换为 1 个空格的字符串,以便将该字符串与 NULL 值区分开。
1> select str_replace("cde fghi "," ","")
2> go
---------
cde fghi
---------------------------------------------------
这个例子中sybase会自动将第三个参数转化为1个空格,相当于用空格替换空格。
str_replace 在第三个参数中接受 NULL,将其视为尝试用 NULL 替换 string_expression2,有效地将 str_replace 转换成“字符串切除”操作。
1> select str_replace("cde fghi ","",null)
2> go
---------
cdefghi
(1 row affected)
1> select str_replace("cde fghi ","","_")
2> go
---------
cde_fghi_
(1 row affected)