Oracle数据库允许在什么情况下无效的datetime列值时间部分?

Cad*_*oux 1 sql oracle datetime

这种情况出现在现实情况中,其中无效数据存在(并继续进入)Oracle数据库,该数据库被提取到Focus中的数据处理系统中.聚焦会因某些行无效时间而窒息死亡.然后Oracle DBA会从一个好的列中将日期时间复制到受影响的列中,以允许该过程继续(是的,我知道).

我协助解决了问题并发现在受影响的行上的Oracle中:

DUMP(START_TIME)
Run Code Online (Sandbox Code Playgroud)

得到:

'Typ=12 Len=7: 100,99,255,255,0,0,0'
Run Code Online (Sandbox Code Playgroud)

而:

TO_CHAR(START_TIME, 'YYYY/MM/DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

得到:

ORA-01801: date format is too long for internal buffer
Run Code Online (Sandbox Code Playgroud)

查看DUMP()结果'Typ=12 Len=7: 100,99,255,255,0,0,0'存储约定,看起来它们能够绕过列的语义限制并插入等效的0,-1,-1,-1,-1,-1,-1或0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

这是"有意义的",因为0xFF = 255 = -1可能会导致0000/255/255 255:255:255取决于您如何解释字节,符号和溢出.

在什么条件下(连接机制等)Oracle是否允许无效数据进入datetime列?

Gar*_*ers 6

Oracle通常不允许这样做.OCI层可以绕过数据类型验证 - Oracle基本上相信你在这7个字节中放入的内容构成了一个有效的日期.类似地,在OCI层,Oracle可以传回7个字节的"日期",由客户端软件根据需要对这些字节做任何事情(保留原样,转换为字符串或纪元号... )也许更好的方法是找出加载数据的内容,看看日期是做什么的.

如果您感觉异常不正常,您可以在日期使用未记录的REVERSE函数并使其无效.