Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 在CHAR(3)列上使用prepared语句时的不同匹配_Oracle_Oracle10g_Oracle Sqldeveloper_Oracle Xe - Fatal编程技术网

Oracle 在CHAR(3)列上使用prepared语句时的不同匹配

Oracle 在CHAR(3)列上使用prepared语句时的不同匹配,oracle,oracle10g,oracle-sqldeveloper,oracle-xe,Oracle,Oracle10g,Oracle Sqldeveloper,Oracle Xe,我不得不将CHAR(1 CHAR)列加宽,并且忘记将列类型更改为VARCHAR2: DUPLICADO CHAR(3 CHAR) 我注意到当我的PHP应用程序无法再找到精确匹配时出现的错误,例如: SELECT * FROM NUMEROS WHERE DUPLICADO = :foo 。。。当:foo为#4时,未找到3字符填充的#4值。然而,我最初在SQLDeveloper中调试查询时遇到了麻烦,因为向查询中注入原始值会找到匹配项 SELECT * FROM NUMEROS WHERE D

我不得不将
CHAR(1 CHAR)
列加宽,并且忘记将列类型更改为
VARCHAR2

DUPLICADO CHAR(3 CHAR)
我注意到当我的PHP应用程序无法再找到精确匹配时出现的错误,例如:

SELECT *
FROM NUMEROS
WHERE DUPLICADO = :foo
。。。当
:foo
#4
时,未找到3字符填充的
#4
值。然而,我最初在SQLDeveloper中调试查询时遇到了麻烦,因为向查询中注入原始值会找到匹配项

SELECT *
FROM NUMEROS
WHERE DUPLICADO = '#4'

为什么我要与第二个查询匹配?为什么准备好的语句会有所不同?

为了进一步阐述我的评论,我在文档中找到了一些解释空白填充和非添加比较之间差异的内容:

如果比较中的两个值(等号的两边)都具有数据类型CHAR或NCHAR,或者是文字字符串,则Oracle选择空白填充比较。这意味着,如果长度不同,那么它会用空格填充短的一个,直到它们的长度相同

使用列<代码> PopICADO < /代码>作为<代码> char(3),将值<代码>“4”'/COD>存储在列中,作为三个字符<代码>“4”'/COD>(请注意空白为第三个字符)。当您执行

DUPLICADO='#4'
时,规则说明Oracle将使用空格填充比较,因此空格填充文字
'#4'
,直到它与列具有相同的长度。所以它实际上变成了
DUPLICADO='#4'

但是当您执行DUPLICADO=:foo时,它将取决于bind变量的数据类型。如果数据类型为CHAR,它还将执行空白填充比较。但是,如果数据类型是VARCHAR2,那么Oracle将使用非填充比较,然后由您确保在必要时进行空白填充

根据客户机或客户机语言,您可以指定绑定变量的数据类型,从而根据需要获得空白填充或非添加的比较


SQL Developer可能是一种特殊情况,它可能不允许您指定数据类型—它可能只是默认绑定始终为数据类型VARCHAR2的变量。我对SQL Developer了解不多,无法确定;-)

PHP绑定变量声明为什么数据类型?文本
“#4”
隐式转换为CHAR(3),因此用空格填充<代码>:foobind变量我认为并没有隐式转换,并希望客户端进行填充。我不知道PHP是否有绑定变量的CHAR和VARCHAR2数据类型?如果您可以在PHP中以某种方式将绑定变量声明为CHAR(3),那么它可能会工作,但是如果PHP只有一个“字符串”数据类型,那么默认情况下它可能会映射到VARCHAR2。@KimBergHansen抱歉,我还没有用PHP测试过这一点(我已经在应用程序中修复了列类型,因此为了测试它,我必须回滚到早期版本)。我在sqldeveloper.Aha中发现了不同的行为。所以实际上这个问题可以重新表述为“在SQL Developer中绑定变量的数据类型是什么?”我使用Toad,在这里可以选择绑定变量的数据类型。对于您的问题,答案是,SQL引擎可以计算出文本值的含义,并用必要的空格填充该值。对于绑定变量,SQL引擎依赖于客户端在必要时进行填充。某些客户端或客户端语言有指定数据类型的方法,以便客户端知道如何填充。特定的客户端“SQL Developer”可能没有(我现在不确定;-)跟进:我后来发现我的PHP库不关心设置绑定变量类型,因此所有内容都作为
VARCHAR
处理,因为它使用的是OCI8扩展默认类型(
SQLT\u CHR
).SQL开发人员没有问,所以可能是VARCHAR2