Python向sqlite注册回调函数的问题

lqcharles 2013-06-07 03:37:54
使用python向sqlite注册了一个函数,函数入参预期是一个整型值,遇到长整型时,发生了溢出,python版本是2.5的,为何会发生长整型溢出呢?

import sqlite3
def testInt(para):
print "para type is: %s"%type(para)
print "para value is: %s"%para

con = sqlite3.connect(":memory:")
con.create_function("testInt",1,testInt)
cur = con.cursor()

#执行的sql中使用了python注册给sqlite的函数testInt
cur.execute("select testInt(4294967040)")

#打印结果如下所示,入参是一个长整型,发生了溢出:
para type is: <type 'int'>
para value is: -256

python应该是能够自动转换成长整型的,难道是sqlite调用testInt函数的时候传入的参数值就已经是溢出后的值了?
...全文
185 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChongQingJin28 2013-06-08
  • 打赏
  • 举报
回复
import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()

# 1.sqlite 是支持64位整数的
cur.execute("select abs(?)", (pow(2,35),))
print(cur.fetchone()[0])
cur.execute("select abs(?)", (pow(2,63)-1,))
print(cur.fetchone()[0])
cur.execute("select abs(?)", ('8098080',)) #可以将string转换成int的
print(cur.fetchone()[0])

# 2.如果大于64位就会出错 (但是为什么他也出错呢?)
# 我想是因为你可以用 “-” 来表示负数 不需要用二进制来表示
cur.execute("select ?", (pow(2,63),))
print(cur.fetchone()[0]) #这一段是会有异常的

cur.execute("select -?", (pow(2,63)-1,)) #你可以这样表示负数
print(cur.fetchone()[0])

# 所以说在python内定义的函数仅支持32位整数 并不是因为sqlite
# 我想是因为python中的_sqlite3.pyd ,他原本可以支持64位的 却选择了32位

# 还有一点就是 : 从sqlite传给python函数的数据类型已经不是python中的数据类型了
# 而是sqlite中的数据类型。sqlite是不支持10000位整数的。

# 如果你非要用sqlite 就应该遵守sqlite的规则
CrySleeper 2013-06-08
  • 打赏
  • 举报
回复
http://bugs.python.org/issue8033

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧