导航
  • 主页
  • Python 数据分析三剑客
  • Python 问答

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函数的时候传入的参数值就已经是溢出后的值了?
...全文
110 点赞 收藏 2
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouchongzxc 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
回复
发动态
发帖子
脚本语言(Python,Perl 等)
创建于2007-08-27

3.6w+

社区成员

Python,JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: