DROP TABLE t1;
CREATE TABLE t1 AS (SELECT sysdate mydate FROM dual WHERE 1=2);
ALTER SESSION SET NLS_DATE_FORMAT = 'MON-DD-RR';
INSERT INTO t1 VALUES ('01-02-12');
*
ERROR at line 1:
ORA-01843: not a valid month
不良数据
DROP TABLE t1;
CREATE TABLE t1 AS (SELECT sysdate mydate FROM dual WHERE 1=2);
--User 1
ALTER SESSION SET NLS_DATE_FORMAT = 'MM-DD-RR';
INSERT INTO t1 VALUES ('01-02-11');
--User 2
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-RR';
INSERT INTO t1 VALUES ('01-02-11');
--User 3
ALTER SESSION SET NLS_DATE_FORMAT = 'RR-MM-DD';
INSERT INTO t1 VALUES ('01-02-11');
SELECT to_char(mydate,'MM/DD/YYYY') FROM t1;
因为
'2012/12/1'
在美国是在欧洲的同一个字符串日期之后的 11 个月。允许隐式转换意味着您受位置设置的支配。
如果您能说出 11 个月是可接受的误差范围的企业,我会印象深刻。
如果具有不同日期格式的会话运行代码,则会出现问题。
语句失败
不良数据
在这种情况下,因为每个 alter/insert 语句都可以由不同的用户完成。他们都将运行相同的语句,但结果日期将完全不同。插入语句可能隐藏在仅间接调用的包中。因为没有返回错误,所以直到很久以后才可能发现问题。
SQL 注入
在这种情况下,恶意个人可以更改会话日期格式,从而使他们能够访问他们通常无法访问的数据。