Oracle 非凡字符的插入
环境配置: server:Linux9 db server: oracle817.4 client os:windows2000 pro oracle client: oracle 9i
今天一个同事运行脚本,向数据库中插入数据.数据的格式如下:
SQL> ed 已写入文件 afiedt.buf
1* insert into dept values(92,'Jackey&&jjjdd','HZ'); SQL> / 输入 jjjdd 的值: dd 原值 1: insert into dept values(92,'Jackey&&jjjdd','HZ'); 新值 1: insert into dept values(92,'Jackeydd','HZ'); insert into dept values(92,'Jackeydd','HZ'); * ERROR 位于第 1 行: ORA-00911: invalid character
结果发现到数据库中的数据和插入的数据不一致.主要表现是在插入的字符串的中假如包括了'&', 则'&'后面的字符就会丢失. 后来发现了造成这种情况的原因.因为'&'在sqlplusw中被定义为自定义变量标示符合,因此'&' 符合后面的字符自然被解析为变量名字.因为没有输入变量的值,所以'&'后面的内容被认为是空的了. 于是,我检查了一下session中的设置发现. ---------------------------------------------------------------------------------- 已用时间: 00: 00: 00.00 SQL> show all appinfo为OFF并且已设置为"SQL*Plus" arraysize 15 autocommit OFF autoprint OFF autorecovery OFF autotrace OFF blockterminator "." (hex 2e) BTitle OFF and 为下一条 SELECT 语句的前几个字符 cmdsep OFF colsep " " compatibility version NATIVE concat "." (hex 2e) copycommit 0 COPYTYPECHECK 为 ON define OFF describe DEPTH 1 LINENUM OFF INDENT ON echo OFF editfile "afiedt.buf" embedded OFF escape OFF 用于6或更多行的 FEEDBACK ON flagger OFF flush ON heading ON headsep "" (hex 7c) instance "local" linesize 500 lno 9 loboffset 1 logsource "" long 80 longchunksize 80 markup Html OFF HEAD "<style type='text/Css'> body {font:10pt Ar newpage 1 null "" numformat "" numwidth 10 pagesize 14 PAUSE 为OFF pno 1 recsep WRAP recsepchar " " (hex 20) release 801070400 repfooter OFF and 为 NULL repheader OFF and 为 NULL serveroutput OFF shiftinout INVISIBLE showmode OFF spool OFF sqlblanklines OFF sqlcase MIXED sqlcode 0 sqlcontinue "> " sqlnumber ON sqlpluscompatibility 8.1.7 sqlprefix "#" (hex 23) sqlprompt "SQL> " sqlterminator ";" (hex 3b) suffix "sql" tab ON termout ON time OFF timing ON trimout ON trimspool OFF ttitle OFF and 为下一条 SELECT 语句的前几个字符 underline "-" (hex 2d) USER 为"SCOTT" verify ON wrap : 行将为已换行 SQL> ---------------------------------------------------------------------------------- 在上面的输出中,可以看到define参数被设置为on. 后来我从新设置define为off(set define off); 重新执行插入语句,运行结果如下: SQL> CREATE TABLE TEST3 ( 2 ID NUMBER (2) PRIMARY KEY, 3 NAME VARCHAR2 (20));
表已创建。
已用时间: 00: 00: 00.02 SQL> SQL> show define define OFF SQL> insert into test3 values(2,'sgs&a&n');
已创建 1 行。
已用时间: 00: 00: 00.00 SQL> select * from test3;
ID NAME ---------- ---------------------------------------- 2 sgs&a&n
已用时间: 00: 00: 00.00
结果显示,插入'&'字符成功.
后来,我又在sqlplus直接运行,居然也成功.后来我检查了一下define的设置,此时为 define on状态. 可是为什么却可以插入了.后来又把他设置为off,同样可以插入成功.因为我觉得sqlplus命令行是不支持 自定义变量,因此可以插入成功.而sqlplusw支持自定义变量,所以一定要先设置过define off才可以.
|