Python 我的前导零去哪里了?

Python 我的前导零去哪里了?,python,sqlite,Python,Sqlite,我从逗号分隔的文本文件中读取数字,其中一些数字的格式为000000084。这些文件被添加到messageclass中,然后放入SQLite数据库中。我的问题是SQLite将这些000000084保存为84,即使我将表列创建为字符串 输入文件 something,000000018,213123 somethingelse,000000025,213123 创建数据库: def createDatabase(databasepath): con = lite.connect(databa

我从逗号分隔的文本文件中读取数字,其中一些数字的格式为000000084。这些文件被添加到messageclass中,然后放入SQLite数据库中。我的问题是SQLite将这些000000084保存为84,即使我将表列创建为字符串

输入文件

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)")
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')
消息类:

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 createDatabase(databasepath):
    con = lite.connect(databasepath)
    with con:
        cur = con.cursor()
        cur.execute("CREATE TABLE staticMessage(userid string)")
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

这对我来说是一个很大的麻烦,因为我想查询我的数据库以获得少于9位的用户ID


TL/DR:插入SQLite时,我的前导零在哪里?

000000084
不是数字,
84
是数字。您希望将它们存储在SQLite的文本数据字段中。

SQLite不强制强列类型。相反,SQLite使用一种称为类型关联的东西:有一种首选的存储类型,它是从列声明和一些内部规则派生出来的,但是您可以很好地将文本存储为数字,反之亦然

以下内容清楚地解释了将确定用于存储数据的类型的规则:

列的关联性由声明的 列,按照以下规则的顺序显示:

  • 如果声明的类型包含字符串“INT”,则为其分配整数关联

  • 如果声明的列类型包含任何字符串“CHAR”、“CLOB”或“TEXT”,则该列具有文本相关性。注意 类型VARCHAR包含字符串“CHAR”,因此被赋值 文本亲和力

  • 如果列的声明类型包含字符串“BLOB”,或者未指定类型,则该列没有关联

  • 如果列的声明类型包含任何字符串“REAL”、“FLOA”或“DOUB”,则该列具有真正的关联性

  • 否则,关联是数值的

  • 请注意,确定列关联性的规则顺序为 重要的声明类型为“CHARINT”的列将同时匹配这两种类型 规则1和2,但第一条规则优先,因此列 关联将是整数

    由于您的列被声明为“string”——不能派生为一个特定的类型关联,SQLite将尽可能从规则5中尝试将数据存储为数字。因此,如果可以将值转换为数字,则删除前导零

    但是请注意,您可以存储文本(比如:“T000000084”)而不会出现任何问题——因为SQLite无法将其转换为数字(首选类型关联),所以它会将其存储为文本



    鉴于我们的特殊需要,您应该使用文本关联声明您的列。也就是说,使用一个包含字符串
    CHAR
    CLOB
    TEXT
    类型的类型(规则2)。

    只是一个小提示,您应该明确使用它来读取文件中的值,而不是滚动自己的值。您只需在staticMessage:中对消息执行
    ,不需要
    范围和数组索引。当你说“我得到84”时,你能展示一下你是如何显示的吗?这可能是问题所在,而不是数据错误地存储在数据库中。您是否已签入原始数据库表以查看它是否作为
    “000000084”
    插入?显示表架构。@Aruistante感谢您的回答。通过运行上面显示的查询,我得到了84。ubuntu终端输出84。但是你是对的,有可能它确实被保存了,但是它在输出中被削减了。@ingacio vazquez abrams表格模式显示在我创建表格的地方,你不能直接转换
    int('0000000 84')
    ?谢谢你的回答,我会试试看。