【问题标题】:Error while inserting data having single quotes between it插入具有单引号的数据时出错
【发布时间】:2012-01-01 13:53:43
【问题描述】:

我有一个将 clob 数据保存到数据库中的应用程序。 假设当我将一些文本放入文本框中,然后单击保存。 它将调用一个将这个文本(clob)插入到数据库表中的过程。

假设我有以下文本:

你好,我是 gaurav 的儿子

现在我的程序将此 clob 数据作为:

insert into rtf_clob(1,'Hi i am gaurav's soni's');

但这会引发错误。

如何处理来自前端的动态数据中的这个单引号?
我使用 oracle 作为 RDBMS。

【问题讨论】:

    标签: sql oracle plsql oracle9i


    【解决方案1】:

    双倍': 插入 rtf_clob(1,'Hi i am gaurav''s soni''s');

    【讨论】:

    • :如何加倍,意思是我应该用什么函数来加倍?当我从前端获取 clob 数据时如何?
    • 现在你已经离开了我的知识。还有其他人吗?
    • psoug.org/reference/translate_replace.html 应该可以帮助您。特别是replace(yourstring, '''', '''''') 应该可以解决问题。
    • INSERT INTO rtf_clob values(1 ,q'[my name is gaurav's soni's]');
    【解决方案2】:

    您不应该编写代码来转义字符串。您需要转义字符串这一事实意味着您做错了什么。

    如果您在INSERT 语句中使用绑定变量,则当存在杂散单引号时无需转义字符串。如果您不使用绑定变量,也无需尝试识别字符串中的 SQL 注入攻击,这是一个巨大的安全问题。而且您不会强迫 Oracle 每次执行查询时都对其进行解析,这对系统性能至关重要。

    如果您所说的过程是用 PL/SQL 编写的,它将自动使用绑定变量。猜测列名并假设您使用序列来生成主键,您将拥有类似的内容

    CREATE PROCEDURE insert_rtf_clob( p_clob IN NOCOPY CLOB )
    AS
    BEGIN
      INSERT INTO rtf_clob( rtf_clob_id, rtf_clob_value )
        VALUES( seq_rtf_clob_id.nextval, p_clob );
    END;
    

    其他前端语言将有不同的方法来使用绑定变量。例如,如果您使用 JDBC 编写 Java,您将创建一个 PreparedStatement,然后调用适当的 setXXX 方法,即

    PreparedStatement stmt = conn.prepareStatement( "INSERT INTO rtf_clob VALUES( ?, ? )" );
    stmt.setInt( 1, 1 ); // Set column 1 to a value of 1
    stmt.setString( 2, someStringVariable ); // Set column 2 to someStringVariable
    stmt.executeUpdate();
    

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      相关资源
      最近更新 更多