45

如何编写包含 & 字符的插入语句?例如,如果我想在数据库的列中插入“J&J Construction”。

我不确定它是否有所作为,但我使用的是 Oracle 9i。

4

14 回答 14

68

我一直忘记这一点,然后又回来了!我认为最好的答案是迄今为止提供的答案的组合。

首先,& 是 sqlplus/sqldeveloper 中的变量前缀,因此存在问题 - 当它出现时,它应该是变量名的一部分。

SET DEFINE OFF 将停止 sqlplus 以这种方式解释 &。

但是如果您需要使用 sqlplus 变量文字 & 字符怎么办?

  • 您需要 SET DEFINE ON 才能使变量起作用
  • 并设置 ESCAPE ON 以逃避 & 的使用。

例如

set define on
set escape on

define myvar=/forth

select 'back\\ \& &myvar' as swing from dual;

产生:

old   1: select 'back\\ \& &myvar' from dual
new   1: select 'back\ & /forth' from dual

SWING
--------------
back\ & /forth

如果要使用不同的转义字符:

set define on
set escape '#'

define myvar=/forth

select 'back\ #& &myvar' as swing from dual;

当您设置特定的转义字符时,您可能会看到“SP2-0272:转义字符不能是字母数字或空格”。这可能意味着您已经定义了转义字符,并且事情变得非常自我引用。避免这个问题的干净方法是首先设置逃生:

set escape off
set escape '#'
于 2009-01-04T05:07:20.790 回答
20

如果你是从 SQLPLUS 做的,请使用

SET DEFINE OFF  

阻止它作为特例

于 2008-09-30T12:37:30.187 回答
15

另一种解决方案,使用连接和 chr 函数:

select 'J' || chr(38) || 'J Construction' from dual;
于 2013-04-12T15:48:08.480 回答
8

正确的语法是

set def off;
insert into tablename values( 'J&J');
于 2008-09-30T13:15:44.993 回答
5

总是有 chr() 函数,它将 ascii 代码转换为字符串。

IE。类似于: INSERT INTO table VALUES ( CONCAT( 'J', CHR(38), 'J' ) )

于 2009-01-04T07:32:39.933 回答
5
INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')

此查询的输出:Jonhy's Sport & Fitness

于 2018-01-22T13:16:00.290 回答
4

SET SCAN OFF 已过时 http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a90842/apc.htm

于 2008-09-30T12:40:30.213 回答
4

在程序中,始终使用参数化查询。它避免了 SQL 注入攻击以及 SQL 解析器特有的任何其他字符。

于 2008-09-30T12:45:13.647 回答
4

您可以插入这样的字符串'J'||'&'||'Construction'。它工作正常。

insert into table_name (col_name) values('J'||'&'||'Construction');
于 2016-04-06T06:50:23.603 回答
2

我发现使用以下任一选项都有效:

SET DEF OFF

或者

SET SCAN OFF

我对数据库知之甚少,无法知道一个比另一个更好还是“更正确”。另外,如果有比这两个更好的东西,请告诉我。

于 2008-09-30T12:39:18.357 回答
0

如果您使用的是 sql plus 那么我认为您需要发出命令

SET SCAN OFF
于 2008-09-30T12:36:53.903 回答
0
SET ESCAPE ON;
INSERT VALUES("J\&J Construction") INTO custnames;

(未经测试,手头没有Oracle盒子,已经有一段时间了)

于 2008-09-30T12:39:06.097 回答
0

停止使用 SQL/Plus,我强烈推荐PL/SQL Developer ,它不仅仅是一个 SQL 工具。

ps 有些人更喜欢TOAD

于 2008-10-06T19:54:59.693 回答
0

看,安德鲁:

《强生建设》

SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;
于 2017-08-30T11:35:27.763 回答