将数字作为字符串插入文本列,SQLite仍然删除前导零

12

我得到了以下字符串: String numberString = "079674839";

当我将这个数字插入到SQLite数据库中时,SQLite会自动删除前导零,并将该字符串存储为79674839。考虑到亲和性和该列存储为TEXT,SQLite应该存储整个字符串并保留前导零吗?

谢谢

2个回答

9

请仔细检查您的数据库模式。根据SQLite Version 3中的数据类型文档,列类型名称会影响存储值之前的处理方式。

以下是一个使用内存数据库演示的Python程序:

import sqlite3

db = sqlite3.connect(':memory:')
val = "0796";
db.execute('CREATE TABLE test (i INTEGER, r REAL, t TEXT, b BLOB);')
db.execute('INSERT INTO test VALUES (?, ?, ?, ?);', (val, val, val, val))
res = db.execute('SELECT * FROM test');
print '\t'.join([x[0] for x in res.description])
for row in res.fetchall():
    print '\t'.join([repr(x) for x in row])

输出结果如下:
i    r      t       b
796  796.0  u'0796' u'0796'

所以,看起来你的列实际上是整数类型。查看模式定义(sqlite3 database.db .schema 可以在命令行中使用),再次查看文档,确保你正在使用映射到TEXT亲和性的类型名称之一。未知类型名称会获得INTEGER亲和性。
在我的情况下,我正在使用“STR”,它最终具有默认的INTEGER亲和性。我将其更改为“TEXT”,SQLite开始尊重我的前导零。

1
非常感谢,这应该是被接受的答案。SQLite的类型亲和性可能会导致一些难以追踪的恶性错误。SQLite应该为无效类型抛出错误...你可以将其放在CREATE TABLE tableName (Col1 ScoobyDoobyDoo);中,它将默认为整数,但直到您开始查询类似于“00789”的内容并且结果为789时,您才会有任何想法... - Steel Nation

1

如果数字在内联 SQL 代码中的任何位置,请使用单引号(即 '079674839')括起来。此外,如果您正在以编程方式执行此操作,请确保不进行数字转换。


我正在以编程方式添加字符串。那么,在SQLite中是否有一种方法可以存储包括前导零的数字? - ram
我最终通过在将数字插入数据库之前添加一个令牌,并在从数据库检索数字后删除该令牌来解决了这个问题。但是,这需要进行字符串操作,这非常慢。 - ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接