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'[…]”
,其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中
- !李>
- []
- {}
- ()
- <>
SELECT q'[aaa'gh]' FROM DUAL;
它为开发人员节省了大量时间。我们(开发人员)在开发数据库中使用dbms_输出来验证动态sql的那些日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。最好的方法是使用。语法为
q'[…]”
,其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中
- !李>
- []
- {}
- ()
- <>
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或任何软件中保留或特殊的原因相同。当您设计应用程序并期望用户输入值时,您肯定需要对输入进行验证。例如,如果我想要名称作为输入