Oracle云数据库特定数值显示为NULL的异常问题求助
Oracle云19c数据库数值列显示异常问题排查
问题现象
Delphi应用使用19.18.0.0.0版本Oracle客户端连接Oracle云19c数据库,近几个月出现异常:向数值列插入部分特定数值后,这些字段在SQL Developer等工具中显示为NULL,但在该Delphi应用自身查询时数值显示正常。
- 执行
SELECT TO_NUMBER(COL1) FROM TEST;会抛出ORA-01722无效数字错误。 - 触发问题的数值包括:123、197、198、199、1480000、1490000、1700000、1710000;196、200等数值无此问题。
- 使用
NVL函数验证,这些显示为NULL的字段并非真实NULL(NVL(COL1, 1000)仍返回NULL,但DUMP能看到存储的字节数据)。
测试验证细节
测试表创建
CREATE TABLE TEST ( TOOL NUMBER(1), COL1 NUMBER(15,2) );
插入操作
Delphi应用执行的插入语句
INSERT INTO TEST (TOOL, COL1) VALUES (1, NULL); INSERT INTO TEST (TOOL, COL1) VALUES (1, 196); INSERT INTO TEST (TOOL, COL1) VALUES (1, 197); INSERT INTO TEST (TOOL, COL1) VALUES (1, 198); INSERT INTO TEST (TOOL, COL1) VALUES (1, 199); INSERT INTO TEST (TOOL, COL1) VALUES (1, 200); COMMIT;
SQL Developer执行的插入语句
INSERT INTO TEST (TOOL, COL1) VALUES (2, NULL); INSERT INTO TEST (TOOL, COL1) VALUES (2, 196); INSERT INTO TEST (TOOL, COL1) VALUES (2, 197); INSERT INTO TEST (TOOL, COL1) VALUES (2, 198); INSERT INTO TEST (TOOL, COL1) VALUES (2, 199); INSERT INTO TEST (TOOL, COL1) VALUES (2, 200); COMMIT;
查询结果对比
Delphi应用执行查询的结果
SELECT TOOL, COL1, COL1 + 1 COL1P1, DUMP(COL1, 16) DMP FROM TEST WHERE (COL1 IS NOT NULL);
| TOOL | COL1 | COL1P1 | DMP |
|---|---|---|---|
| 1 | 196 | 197 | Typ=2 Len=3: c2,2,61 |
| 1 | 197 | 198 | Typ=2 Len=3: c2,2,62 |
| 1 | 198 | 199 | Typ=2 Len=3: c2,2,63 |
| 1 | 199 | 200 | Typ=2 Len=3: c2,2,64 |
| 1 | 200 | 201 | Typ=2 Len=2: c2,3 |
| 2 | 196 | 197 | Typ=2 Len=3: c2,2,61 |
| 2 | 197 | 198 | Typ=2 Len=3: c2,2,62 |
| 2 | 198 | 199 | Typ=2 Len=3: c2,2,63 |
| 2 | 199 | 200 | Typ=2 Len=3: c2,2,64 |
| 2 | 200 | 201 | Typ=2 Len=2: c2,3 |
SELECT TOOL, COL1, COL1 + 1 COL1P1, DUMP(COL1, 16) DMP FROM TEST WHERE (COL1 IS NULL);
| TOOL | COL1 | COL1P1 | DMP |
|---|---|---|---|
| 1 | NULL | NULL | NULL |
| 2 | NULL | NULL | NULL |
SQL Developer执行查询的结果
SELECT TOOL, COL1, COL1 + 1 COL1P1, DUMP(COL1, 16) DMP FROM TEST WHERE (COL1 IS NOT NULL);
| TOOL | COL1 | COL1P1 | DMP |
|---|---|---|---|
| 1 | 196 | 197 | Typ=2 Len=3: c2,2,61 |
| 1 | NULL | 198 | Typ=2 Len=4: c2,2,61,65 |
| 1 | NULL | 199 | Typ=2 Len=4: c2,2,62,65 |
| 1 | NULL | 200 | Typ=2 Len=4: c2,2,63,65 |
| 1 | 200 | 201 | Typ=2 Len=2: c2,3 |
| 2 | 196 | 197 | Typ=2 Len=3: c2,2,61 |
| 2 | 197 | 198 | Typ=2 Len=3: c2,2,62 |
| 2 | 198 | 199 | Typ=2 Len=3: c2,2,63 |
| 2 | 199 | 200 | Typ=2 Len=3: c2,2,64 |
| 2 | 200 | 201 | Typ=2 Len=2: c2,3 |
SELECT TOOL, COL1, COL1 + 1 COL1P1, DUMP(COL1, 16) DMP FROM TEST WHERE (COL1 IS NULL);
| TOOL | COL1 | COL1P1 | DMP |
|---|---|---|---|
| 1 | NULL | NULL | NULL |
| 2 | NULL | NULL | NULL |
NVL函数测试结果
SELECT TOOL, COL1, NVL(COL1, 1000) COL1NVL, DUMP(NVL(COL1, 1000), 16) DMP FROM TEST;
| TOOL | COL1 | COL1NVL | DMP |
|---|---|---|---|
| 1 | 196 | 196 | Typ=2 Len=3: c2,2,61 |
| 1 | NULL | NULL | Typ=2 Len=4: c2,2,62,65 |
| 1 | NULL | NULL | Typ=2 Len=4: c2,2,63,65 |
| 1 | NULL | NULL | Typ=2 Len=4: c2,2,64,65 |
| 1 | 200 | 200 | Typ=2 Len=2: c2,3 |
| 2 | 196 | 196 | Typ=2 Len=3: c2,2,61 |
| 2 | 197 | 197 | Typ=2 Len=3: c2,2,62 |
| 2 | 198 | 198 | Typ=2 Len=3: c2,2,63 |
| 2 | 199 | 199 | Typ=2 Len=3: c2,2,64 |
| 2 | 200 | 200 | Typ=2 Len=2: c2,3 |
已尝试的排查动作
- 更换Oracle客户端版本至19.19.0.0.0、21.10.0.0.0,问题仍存在。
- 在自建Oracle数据库中使用相同应用和客户端版本,未复现该问题。
求助内容
请问该数据库字段为何会出现这种状态?目前尝试多种工具和客户端组合均无法在自建库复现,寻求相关问题排查思路及解决方案。
内容的提问来源于stack exchange,提问作者Henning
相关产品推荐
相关产品推荐

