我正在从逗号分隔的文本文件中读取数字,其中一些数字在000000084表格中。这些文件被添加到消息类中,然后放入SQLite数据库中。我遇到的问题是SQLite将这些000000084保存为84,即使我将表列创建为字符串。
Inputfile中
something,000000018,213123
somethingelse,000000025,213123
创建数据库:
def createDatabase(databasepath):
con = lite.connect(databasepath)
with con:
cur = con.cursor()
cur.execute("CREATE TABLE staticMessage(userid string)")
消息类:
class StaticMessage:
def __init__ (self, userid):
self.userid = userid
从文件中提取消息:
def extractStaticMessages(filepath):
global staticMessage
staticMessage = []
lengths = []
f = open(filepath, 'r')
for line in f:
newline = line.split(",")
message = StaticMessage(newline[1])
staticMessage.append(message)
将消息写入数据库:
def writeStaticToDatabase(databasepath):
con = lite.connect(databasepath)
con.isolation_level = None
with con:
cur = con.cursor()
cur.execute('BEGIN TRANSACTION')
for i in range(0, len(staticMessage)):
cur.execute("INSERT INTO staticMessage(userid) VALUES(?)",
(staticMessage[i].userid)
cur.execute('COMMIT')
然后我用f.ex查询我的数据库:
select userid from staticMessage where userid='000000084'
我得到84
这对我来说是一个很大的烦恼,因为我想查询我的数据库以获得少于九位的用户ID数。
TL / DR:插入SQLite时我的前导零在哪里?
答案 0 :(得分:3)
SQLite不会强制执行强列输入。相反,SQLite使用名为 type affinity 的东西:有一个首选存储类型,它是从您的列声明和一些内部规则派生的,但您可以很好地将文本存储为数字反之亦然。
official documentation清楚地解释了确定用于存储数据的类型的规则:
列的亲和力由声明的类型决定 列,按照以下规则显示顺序:
如果声明的类型包含字符串" INT"然后它被赋予INTEGER亲和力。
如果声明的列类型包含任何字符串" CHAR"," CLOB"或" TEXT"然后该列具有TEXT亲和力。注意 VARCHAR类型包含字符串" CHAR"并因此被分配 TEXT亲和力。
如果列的声明类型包含字符串" BLOB"或者,如果未指定类型,则该列具有亲和力NONE。
如果列的声明类型包含任何字符串" REAL"," FLOA"或" DOUB"然后该列具有REAL亲和力。
- 醇>
否则,亲和力为NUMERIC。
请注意,确定列关联性的规则的顺序是 重要。声明类型为" CHARINT"将两者都匹配 规则1和2,但第一个规则优先,因此列 亲和力将是INTEGER。
当你的列被声明为" string" - 无法导出到一个特定类型的亲和力,SQLite将尽可能从规则5尝试将数据存储为数字。因此,如果值可以转换为数字,则删除前导零。
但请注意,您可以存储文本(例如:' T000000084')而不会出现任何问题 - 因为SQLite无法将其转换为数字(首选类型亲和力),它将存储它反而是文字。
鉴于我们的特殊需要,您应该使用 text 亲和力声明您的列。即使用包含字符串CHAR
,CLOB
或TEXT
类型(规则2)的类型。
答案 1 :(得分:1)
000000084
不是数字,84
是。您希望将它们存储在SQLite的TEXT数据域中。