小编典典

插入单引号之间的数据时出错

sql

我有一个将Clob数据保存到数据库中的应用程序。假设当我在文本框中输入一些文本,然后单击“保存”。它将调用一个过程,该过程会将此文本(Clob)插入数据库表中。

假设我有以下文字:

嗨,我是高拉夫的索尼

现在,我的过程将此Clob数据作为:

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

但是,这将引发错误。

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


阅读 140

收藏
2021-05-16

共1个答案

小编典典

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

如果您在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();
2021-05-16