【问题标题】:How to insert a string which contains an "&"如何插入包含“&”的字符串
【发布时间】:2025-11-30 14:05:02
【问题描述】:

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

我不确定这是否会有所不同,但我使用的是 Oracle 9i。

【问题讨论】:

    标签: sql oracle escaping sqlplus


    【解决方案1】:

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

    SET SCAN OFF
    

    【讨论】:

      【解决方案2】:

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

      SET DEFINE OFF  
      

      作为一种特殊情况阻止它踩 &

      【讨论】:

        【解决方案3】:
        SET ESCAPE ON;
        INSERT VALUES("J\&J Construction") INTO custnames;
        

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

        【讨论】:

        • 那么您必须对指定反斜杠进行特殊处理。
        【解决方案4】:

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

        SET DEF OFF

        SET SCAN OFF

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

        【讨论】:

          【解决方案5】:
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            正确的语法是

            set def off;
            insert into tablename values( 'J&J');
            

            【讨论】:

              【解决方案8】:

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

              附言有些人更喜欢TOAD

              【讨论】:

                【解决方案9】:

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

                首先,& 是 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 '#'
                

                【讨论】:

                • np!正如我所说,我一直忘记这一点,很高兴有机会记录“综合答案”;-)
                • 这个SQL*Plus FAQ 提供了类似的答案。
                【解决方案10】:

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

                即。就像是: 插入 桌子 价值观( 连接('J',CHR(38),'J') )

                【讨论】:

                  【解决方案11】:

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

                  select 'J' || chr(38) || 'J Construction' from dual;
                  

                  【讨论】:

                  • 您缺少 ||在 chr(38) 之后
                  【解决方案12】:

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

                  insert into table_name (col_name) values('J'||'&'||'Construction');
                  

                  【讨论】:

                    【解决方案13】:

                    看,安德鲁:

                    《强生建设》

                    SELECT CONCAT('J', CONCAT(CHR(38), 'J Construction')) FROM DUAL;
                    

                    【讨论】:

                      【解决方案14】:
                      INSERT INTO TEST_TABLE VALUES('Jonhy''s Sport &'||' Fitness')
                      

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

                      【讨论】: