在我的sql应用程序中进行查询时,我遇到了一个奇怪的问题。我正在使用python3和cx_Oracle 5.1.2。我的测试表按如下方式组织:
创建表人( sin CHAR(15), 名称VARCHAR(40), PRIMARY KEY(罪))
插入以下值(sin,name):
(' 1',' a'),(' 2'' b'),(' 3&# 39;,' C&#39)
当我使用不安全的查询进行简单选择时:
curs.execute("从sin =' 1'")
的人中选择姓名
结果是' a',正如预期的那样,但如果我使用绑定:
curs.execute("从sin =:v",v =' 1')中选择姓名
结果为空。我已经尝试将其更改为位置'?'参数,设置' v'的大小通过setinputsizes(v = 15)但似乎没有任何效果。
我有什么遗失的东西吗?
谢谢,
答案 0 :(得分:2)
问题在于您使用CHAR数据类型而不是VARCHAR2。
即使在SQL * Plus中也可以观察到差异。
如果我们绑定VARCHAR2变量,则不会选择任何行:
SQL> variable v varchar2(15)
SQL> exec :v := '1';
PL/SQL procedure successfully completed.
SQL> select name from people where sin = :v;
no rows selected
如果我们绑定一个CHAR变量,它与列的数据类型相同,则选择一行:
SQL> variable v char(15)
SQL> exec :v := '1';
PL/SQL procedure successfully completed.
SQL> select name from people where sin = :v;
NAME
----------------------------------------
a
因此,您需要将列数据类型从CHAR更改为VARCHAR2(顺便说一句,VARCHAR也已过时)或指示cx_Oracle使用FIXED_CHAR数据类型:
>>> v = curs.var(cx_Oracle.FIXED_CHAR, 15)
>>> v.setvalue(0, '1')
>>> print v
<cx_Oracle.FIXED_CHAR with value '1'>
>>> result = curs.execute("select name from people where sin = :sin", sin=v)
>>> for r in result: print r
('a',)