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