如何在SQL开发人员中插入无效字符的记录行?



我发现在我们客户的生产数据库的表中插入了一条记录。我无法选择该记录的一个字段,但我可以通过 SELECT SQL 语句选择其他字段。

A_TABLE
-------------------
|COL_A|COL_B|COL_C|
-------------------
|.....|.....|.....|
-------------------
|.....|.....|.....|
-------------------
|.....|.....|.....|
-------------------

通过运行以下 SQL 语句将"在 中遇到无效字符"显示为查询结果:

select * from A_TABLE where COL_A = 2;
Query result: Invalid character encountered in

但是,可以成功运行此语句:

select COL_A, COL_C from A_TABLE where COL_A = 2;
Query result:
-------------
|COL_A|COL_C|
-------------
|  2  |.....|
-------------

A_TABLECOL_A值为 2COL_B字段中应该遇到无效字符。您知道为什么COL_B包含无效字符吗?我想尝试创建一行与COL_A值为 2的行相似的记录A_TABLE。我应该通过插入或其他方法做什么?

其实,在我问这个问题之前,我还有其他问题......

更详细的版本:但是,有关此问题的表格的信息已简化。您可能会看到下面提到的几乎原始信息,但出于保护我们客户的机密原因,我重命名了表格和字段的名称。

A_TABLE (almost original version)
---------------------------------------
|COL_A|COL_B|.............|COL_R|COL_S|
---------------------------------------
|.....|.....|.............|.....|.....|
---------------------------------------
|.....|.....|.............|.....|.....|
---------------------------------------
|.....|.....|.............|.....|.....|
---------------------------------------

这是A_TABLE表的 CREATE SQL(但我从 UAT 数据库中的 SQL 复制和修改。它应该与生产相同,但我不确定(:

CREATE TABLE "DBA"."A_TABLE" 
(    "COL_A" NUMBER(10,0) NOT NULL ENABLE, 
"COL_B" VARCHAR2(8 BYTE) NOT NULL ENABLE, 
"COL_C" VARCHAR2(3 BYTE), 
"COL_D" NUMBER(4,0) NOT NULL ENABLE, 
"COL_E" VARCHAR2(1 BYTE) NOT NULL ENABLE, 
"COL_F" VARCHAR2(1 BYTE) NOT NULL ENABLE, 
"COL_G" VARCHAR2(122 BYTE), 
"COL_H" VARCHAR2(160 BYTE), 
"COL_I" VARCHAR2(1 BYTE) NOT NULL ENABLE, 
"COL_J" NUMBER(6,0) NOT NULL ENABLE, 
"COL_K" VARCHAR2(16 BYTE) NOT NULL ENABLE, 
"COL_L" VARCHAR2(50 BYTE), 
"COL_M" DATE, 
"COL_N" VARCHAR2(1 BYTE) NOT NULL ENABLE, 
"COL_O" "SYS"."XMLTYPE"  NOT NULL ENABLE,
"COL_P" DATE NOT NULL ENABLE, 
"COL_Q" DATE NOT NULL ENABLE, 
"COL_R" VARCHAR2(16 BYTE) NOT NULL ENABLE, 
"COL_S" VARCHAR2(3 BYTE), 
CONSTRAINT "A_TABLE_PK" PRIMARY KEY ("COL_K")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X"  ENABLE
) SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_S" 
XMLTYPE COLUMN "COL_O" STORE AS BASICFILE CLOB (
TABLESPACE "TABLESPACE_S" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10
NOCACHE LOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;
CREATE INDEX "DBA"."A_TABLE_IDX1" ON "DBA"."A_TABLE" ("COL_A", "COL_B") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X" ;
CREATE INDEX "DBA"."A_TABLE_IDX2" ON "DBA"."A_TABLE" ("COL_P") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X" ;
CREATE INDEX "DBA"."A_TABLE_IDX3" ON "DBA"."A_TABLE" ("COL_B", "COL_D") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X" ;
CREATE UNIQUE INDEX "DBA"."A_TABLE_IDX4" ON "DBA"."A_TABLE" ("COL_B", "COL_D", "COL_E") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X" ;
CREATE INDEX "DBA"."A_TABLE_IDX5" ON "DBA"."A_TABLE" ("COL_Q", "COL_E") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOLOGGING 
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TABLESPACE_X" ;

因此,我问题的一些信息应该在这里更改,以便与几乎原始版本中的信息保持一致:

通过运行以下 SQL 语句将"在 中遇到无效字符"显示为查询结果:

select * from A_TABLE where COL_B = 00000002;
Query result: Invalid character encountered in

但是,可以成功运行此语句:

--this statement selects all fields of the table except COL_O
select COL_A, COL_B, ..., COL_R, COL_S from A_TABLE where COL_A = 00000002;
Query result (without COL_O field):
------------------------------------------
|COL_A| COL_B  |.............|COL_R|COL_S|
------------------------------------------
|.....|00000002|.............|.....|.....|
------------------------------------------

我应该在这里改写我的问题(在更详细的部分(:A_TABLE的COL_O字段中应该遇到无效字符,COL_B值00000002。你知道为什么COL_O包含无效字符吗?我想尝试创建一行记录,该记录行与COL_B值在A_TABLE中00000002的行相似。我应该通过插入或其他方法做什么?

由于col_oxmltype,它似乎包含一些无效的东西。可能是像promile符号,希腊字母,谁知道是什么 - 数据库字符集不支持的某些字符。

不幸的是,看起来您没有发布您收到的整个错误消息。完整的错误堆栈 - 像这样:

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00216: invalid character 0 (0x13)                  --> this
Error at line 10682

会有所帮助,因为您可以解决这个问题。那0x13会是什么?谷歌知道:

Decimal Octal Hex   Binary    Character 
------- ----- ----  --------  ----------------------------- 
019   023 0x13  00010011  DC3  (XOFF)(Device Control 3)

好的,现在您知道要查找什么,让我们看看如何修复它的示例。

我的XML不包含任何"无效"的内容,但CR(回车,CHR(13)("表示"它。

SQL> create table a_table (id number, col_o xmltype);
Table created.
SQL> insert into a_table (id, col_o) values
2  (1, '<?xml version="1.0" encoding="UTF-8"?>
3          <note>
4            <body>Do ' || chr(13) || 'not do that!</body>      --> here it is
5          </note>');
1 row created.
SQL> select * from a_table;
ID COL_O
---------- --------------------------------------------------
1 <?xml version="1.0" encoding="WINDOWS-1250"?>
<note>
<body>Do                             --> causes line break
not do that!</body>
</note>

为了修复它,请运行一个update

SQL> update a_table set
2    col_o = replace(replace(col_o, chr(13), ''), chr(10), '')
3  where id = 1;
1 row updated.
SQL> select * from a_table;
ID COL_O
---------- --------------------------------------------------
1 <?xml version="1.0" encoding="WINDOWS-1250"?>
<note>
<body>Do not do that!</body>             --> line isn't broken any more
</note>

SQL>

所以:如果你发现它有什么问题,你也许可以修复它。祝你好运!

最新更新