Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何预测和避免单引号';在甲骨文中_Sql_Oracle - Fatal编程技术网

Sql 如何预测和避免单引号';在甲骨文中

Sql 如何预测和避免单引号';在甲骨文中,sql,oracle,Sql,Oracle,假设我有一个列值为aaa'gh,它将在oracle中抛出错误,表示sql命令未正确结束 我的问题是,如果我不知道有多少“在我的价值中,我如何才能安全地逃离它们。最好的方法是使用。语法为q'[…]”,其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中 ! [] {} () 您不必担心字符串中的单引号 假设我有一个列值aaa'gh 因此,您可以简单地将SQL编写为 SELECT q'[aaa'gh]' FROM DUAL; 它为开发人员节省了大量时间。我们(开发人员)在开发

假设我有一个列值为
aaa'gh
,它将在oracle中抛出错误,表示sql命令未正确结束


我的问题是,如果我不知道有多少
在我的价值中,我如何才能安全地逃离它们。

最好的方法是使用。语法为
q'[…]”
,其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中

  • !
  • []
  • {}
  • ()
  • <>
您不必担心字符串中的单引号

假设我有一个列值aaa'gh

因此,您可以简单地将SQL编写为

SELECT q'[aaa'gh]' FROM DUAL;

它为开发人员节省了大量时间。我们(开发人员)在开发数据库中使用dbms_输出来验证动态sql的那些日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。

最好的方法是使用。语法为
q'[…]”
,其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中

  • !
  • []
  • {}
  • ()
  • <>
您不必担心字符串中的单引号

假设我有一个列值aaa'gh

因此,您可以简单地将SQL编写为

SELECT q'[aaa'gh]' FROM DUAL;

它为开发人员节省了大量时间。我们(开发人员)在开发数据库中使用dbms_输出来验证动态sql的那些日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。

我处理这个问题的简单方法始终是使用

replace(string, '''', '''''')

但Lalit Kumar B的解决方案似乎更为复杂

我处理这个问题的简单方法,总是使用

replace(string, '''', '''''')

但是Lalit Kumar B解决方案,从你要做的事情的意义上来说,似乎更为复杂

escape。请在谷歌上搜索“甲骨文中的escape字符”。www.dba-oracle.com/tips\u oracle\u escape\u characters。htm@Exhausted我有一个从数据库中提取的变量。当该变量包含
时,它会产生问题。嗨,AK47,当我手头有一个价值观时,我知道如何逃避。假设我不知道这些值是什么?您正在选择一个变量,用于构建要执行的动态SQL?如果变量包含
,则动态SQL将失败?如何使用绑定变量来包含变量内容,而不是将其连接到动态SQL字符串中?这样,就不需要进行转义,也不可能进行SQL注入,也不可能使用许多唯一语句杀死共享池。(当然,这取决于您的实际用例是什么-在某些情况下,绑定变量解决方案是不可能的,但我们无法从您的描述中分辨出来;-)嗨,Kim,这里的通信发生在基于客户端的脚本语言和oracle之间。更确切地说,我使用的是一个shell脚本,其中我将此列值作为参数传递,从而调用我的客户机脚本。在客户端脚本中,我调用oracle sql并使用此列值获取一些内容。在此提取过程中,如果我的列具有此
值,则我的客户端脚本在尝试执行此sqlescape时失败,即您将要执行的操作。请在google上搜索“Oracle中的Escape字符”。www.dba-oracle.com/tips\u oracle\u escape\u characters。htm@Exhausted我有一个从数据库中提取的变量。当该变量包含
时,它会产生问题。嗨,AK47,当我手头有一个价值观时,我知道如何逃避。假设我不知道这些值是什么?您正在选择一个变量,用于构建要执行的动态SQL?如果变量包含
,则动态SQL将失败?如何使用绑定变量来包含变量内容,而不是将其连接到动态SQL字符串中?这样,就不需要进行转义,也不可能进行SQL注入,也不可能使用许多唯一语句杀死共享池。(当然,这取决于您的实际用例是什么-在某些情况下,绑定变量解决方案是不可能的,但我们无法从您的描述中分辨出来;-)嗨,Kim,这里的通信发生在基于客户端的脚本语言和oracle之间。更确切地说,我使用的是一个shell脚本,其中我将此列值作为参数传递,从而调用我的客户机脚本。在客户端脚本中,我调用oracle sql并使用此列值获取一些内容。在这个获取过程中,如果我的列有这个
值,那么我的客户端脚本在尝试执行这个sql时会失败实际上,新的文字引用技术为开发人员节省了很多时间:-)我们开发人员过去在开发数据库中使用dbms_输出检查动态sql的日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。这实际上比公认的答案更有效,因为它正确地处理输入,如abc'de,实际上,新的文字引用技术为开发人员节省了大量时间:-)我们开发人员过去使用dbms_输出在开发数据库中检查动态sql的那些日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。这实际上比公认的答案更有效,因为它正确地处理了诸如abc'de以及abc]'deHere关于“q-quoting”的文档:我认为这并不能解决问题。如果用户输入为aaa]'gh,则执行仍然失败,您仍然可以进行SQL注入。@jgosar将这些字符称为特殊字符是有原因的,这与某些字符和关键字在Oracle或任何软件中保留或特殊的原因相同。当您设计应用程序并期望用户输入值时,您肯定需要对输入进行验证。例如,如果我想要名称作为输入