这种情况出现在现实情况中,其中无效数据存在(并继续进入)Oracle数据库,该数据库被提取到Focus中的数据处理系统中.聚焦会因某些行无效时间而窒息死亡.然后Oracle DBA会从一个好的列中将日期时间复制到受影响的列中,以允许该过程继续(是的,我知道).
我协助解决了问题并发现在受影响的行上的Oracle中:
DUMP(START_TIME)
得到:
'Typ=12 Len=7: 100,99,255,255,0,0,0'
而:
TO_CHAR(START_TIME, 'YYYY/MM/DD HH24:MI:SS')
得到:
ORA-01801: date format is too long for internal buffer
查看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列?
Oracle通常不允许这样做.OCI层可以绕过数据类型验证 - Oracle基本上相信你在这7个字节中放入的内容构成了一个有效的日期.类似地,在OCI层,Oracle可以传回7个字节的"日期",由客户端软件根据需要对这些字节做任何事情(保留原样,转换为字符串或纪元号... )也许更好的方法是找出加载数据的内容,看看日期是做什么的.
如果您感觉异常不正常,您可以在日期使用未记录的REVERSE函数并使其无效.