【问题标题】:How to enter special characters like “\” in oracle database INSERT STATEMENT?如何在 oracle 数据库 INSERT STATEMENT 中输入“\”等特殊字符?
【发布时间】:2015-07-08 04:12:31
【问题描述】:

更新: 我刚刚发现问题不是来自反斜杠。问题是单引号问题。我正在尝试插入带有撇号的单词,只要我的列表中有一个,撇号就会被视为单引号。因此,即使我在原始插入值中没有反斜杠,Oracle 也会自动添加反斜杠。

例子:

INSERT INTO DICTIONNAIRE (Mot) 值 ('s\'ensuivre');

原来是

INSERT INTO DICTIONNAIRE (Mot) VALUES ('s'ensuivre');

有没有办法将撇号区别于值周围的单引号?

原问题:

我想插入一个反斜杠作为字符串:

INSERT INTO Dictionnaire (Mot,Definition) VALUES ('abasourdir','v. tr.\\n Ahurir.');

有没有办法防止 反斜杠 做它的事 通常会这样做,即:“转义单个字符或符号”,并且 有 DBMS 把它当作一个简单的字符串吗?

设置定义关闭;不工作。

谢谢!

【问题讨论】:

  • 双反斜杠不起作用吗?
  • 您的语句应该可以工作,反斜杠在 SQL 插入中不是转义字符。您使用的是什么 SQL 客户端?
  • @mr_eclair 除非转义字符设置为'\'
  • 您是在编写 SQL 脚本还是在传递其他语言的查询?如果是第二种,几乎总有一种方法可以参数化您的查询,以便您可以自然地传递数据,而不必处理转换/转义数据。

标签: sql oracle escaping sql-insert


【解决方案1】:
SQL> CREATE TABLE Dictionnaire(MOT VARCHAR2(20),Definition varchar2(40));

Table created.

Elapsed: 00:00:00.71

如果你也想要引号,如果你只想要反斜杠然后查看其他插入,

SQL> INSERT INTO Dictionnaire (Mot,Definition) VALUES ('abasourdir','v. tr.''\''n Ahurir.');

1 row created.


Elapsed: 00:00:00.01
SQL> select * from Dictionnaire ;

MOT                  DEFINITION
-------------------- ----------------------------------------
abasourdir           v. tr.'\'n Ahurir.

Elapsed: 00:00:00.01


SQL> INSERT INTO Dictionnaire (Mot,Definition) VALUES ('abasourdir','v. tr.\n Ahurir.');

1 row created.

Elapsed: 00:00:00.01
SQL> select * from Dictionnaire ;

MOT                  DEFINITION
-------------------- ----------------------------------------
abasourdir           v. tr.'\'n Ahurir.
abasourdir           v. tr.\n Ahurir.

Elapsed: 00:00:00.01

【讨论】:

    【解决方案2】:

    我想插入一个反斜杠作为字符串:INSERT INTO Dictionnaire (Mot,Definition) VALUES ('abasourdir','v. tr.\n Ahurir.');

    只有在您将转义字符设置为反斜杠时,反斜杠才会用作转义字符,或者在单个 SQL 语句中使用 ESCAPE 命令。以免您应该能够像任何其他字符一样插入它。

    使用两个反斜杠 代替一个一个反斜杠

    例如我设置了转义字符为set escape '\'

    SQL> CREATE TABLE t(a number, b VARCHAR2(10));
    
    Table created.
    
    SQL>
    SQL> set escape '\'
    SQL>
    SQL> INSERT INTO t VALUES(1, '\\');
    
    1 row created.
    
    SQL> INSERT INTO t VALUES(2, '\\n');
    
    1 row created.
    
    SQL>
    SQL> SELECT * FROM t;
    
             A B
    ---------- ----------
             1 \
             2 \n
    
    SQL>
    

    有没有办法阻止反斜杠做它通常做的事情,即:“转义单个字符或符号”,并让 DBMS 将其视为简单字符串?

    那就不要用反斜杠转义了。将任何其他字符设置为转义字符

    例如,我将使用正斜杠作为转义字符而不是反斜杠:

    SQL> DROP TABLE t PURGE;
    
    Table dropped.
    
    SQL>
    SQL> CREATE TABLE t(a number, b VARCHAR2(10));
    
    Table created.
    
    SQL>
    SQL> set escape '/'
    SQL>
    SQL> INSERT INTO t VALUES(1, '\');
    
    1 row created.
    
    SQL> INSERT INTO t VALUES(2, '\n');
    
    1 row created.
    
    SQL> INSERT INTO t VALUES(2, '/n');
    
    1 row created.
    
    SQL>
    SQL> SELECT * FROM t;
    
             A B
    ---------- ----------
             1 \
             2 \n
             2 n
    
    SQL>
    

    因此,如您所见,只有正斜杠用于转义,而不是反斜杠。

    就此而言,您也可以使用任何其他字符来转义:

    SQL> set escape '#'
    SQL>
    SQL> INSERT INTO t VALUES(1, '\');
    
    1 row created.
    
    SQL> INSERT INTO t VALUES(2, '\n');
    
    1 row created.
    
    SQL> INSERT INTO t VALUES(2, '#n');
    
    1 row created.
    
    SQL>
    SQL> SELECT * FROM t;
    
             A B
    ---------- ----------
             1 \
             2 \n
             2 n
    
    SQL>
    

    因此,您可以看到 '#' 被用作转义字符。反斜杠没有影响。

    【讨论】:

      【解决方案3】:

      我刚刚发现问题不是来自反斜杠。问题是单引号问题。我正在尝试插入带有撇号的单词,只要列表中有一个,撇号就会被视为单引号。因此,即使我在原始插入值中没有反斜杠,Oracle 也会自动添加反斜杠。

      例子:

      INSERT INTO DICTIONNAIRE (Mot) 值 ('s\'ensuivre');

      原来是

      INSERT INTO DICTIONNAIRE (Mot) VALUES ('s'ensuivre');

      有没有办法将撇号区别于值周围的单引号?

      【讨论】:

      • 另外,StackOverflow 真的不是一个讨论论坛。对于这样的事情,您应该编辑您的问题并添加此信息。
      【解决方案4】:

      有没有办法将撇号区别于值周围的单引号?

      INSERT INTO DICTIONNAIRE (Mot) VALUES ('s'ensuivre');
      

      是的,要在值中插入单引号,只需将其加倍即可。

      INSERT INTO DICTIONNAIRE (Mot) VALUES ('s''ensuivre');
      

      【讨论】:

      • 哦.. 我有一个从字典文本文件中提取的 27,700 个单词的列表。我无法实际编辑和加倍每个撇号实例。您看到其他解决方案了吗?
      • @VincentLabrecque 在这种情况下,最好的选择可能是编写客户端应用程序(使用您选择的语言和 Oracle 驱动程序),并通过准备好的语句插入这些值。准备好的语句应该自动转义特殊字符,如撇号。
      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2021-07-06
      • 2021-03-27
      • 2011-02-04
      相关资源
      最近更新 更多