在我的 oracle 数据库中,我有一个名为 PERSON 的表,其中包含列代码、姓氏、名字。
例如。'PER001', '________________', 'Bob'
(注:_ = 空格)
surname 设置为 NOT NULL,但您可以输入诸如“”之类的空格字符串。
我对此有疑问,因为当 Ibatis 将此列映射到一个对象时,它会将其映射为 NULL!什么时候应该将其映射为“”?
有任何想法吗?
好的,我已经想通了!我没想到ibatis生成的setter会修剪字符串!>_>
前:
public void setSURNAME(String SURNAME) {
this.SURNAME = SURNAME == null ? null : SURNAME.trim();
}
使固定!:
public void setSURNAME(String SURNAME) {
this.SURNAME = SURNAME == null ? null : SURNAME;
}
谢谢你们的帮助!对不起>_>!
将空字符串视为 NULL 是 Oracle 的怪癖之一。这在某些方面是有争议的(尝试在http://www.google.co.uk/search?q=oracle+null+ "empty+string" 上搜索)。Oracle 将来可能会改变这种行为。只是不要屏住呼吸。
编辑
正如已经指出的那样,它不是一个空字符串,而是一串空白。好吧,在那种情况下,它不是甲骨文本身。
SQL> desc emp
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME NOT NULL VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> insert into emp (empno, ename) values (9999, ' ')
2 /
1 row created.
SQL> select length(ename) from emp
2 where empno = 9999
3 /
LENGTH(ENAME)
-------------
6
SQL>
可能的罪魁祸首是:
将 aTRIM()
应用于相关列的触发器(或一些类似的处理)
IBATIS 以某种方式介入
这是在回避问题,但是您可以选择另一个字符串,例如“-”或“_”来表示缺失值吗?
根据您的软件堆栈的所有部分对空字符串的处理方式与空字符串的处理方式与空字符串的处理方式不同,这似乎是相当冒险的。