Python向sqlite注册回调函数的问题
使用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函数的时候传入的参数值就已经是溢出后的值了?
[解决办法]
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的规则