我的前导零在哪里?

时间:2015-03-14 16:50:40

标签: python sqlite

我正在从逗号分隔的文本文件中读取数字,其中一些数字在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时我的前导零在哪里?

2 个答案:

答案 0 :(得分:3)

SQLite不会强制执行强列输入。相反,SQLite使用名为 type affinity 的东西:有一个首选存储类型,它是从您的列声明和一些内部规则派生的,但您可以很好地将文本存储为数字反之亦然。

official documentation清楚地解释了确定用于存储数据的类型的规则:

  

列的亲和力由声明的类型决定   列,按照以下规则显示顺序:

     
      
  1. 如果声明的类型包含字符串" INT"然后它被赋予INTEGER亲和力。

  2.   
  3. 如果声明的列类型包含任何字符串" CHAR"," CLOB"或" TEXT"然后该列具有TEXT亲和力。注意   VARCHAR类型包含字符串" CHAR"并因此被分配   TEXT亲和力。

  4.   
  5. 如果列的声明类型包含字符串" BLOB"或者,如果未指定类型,则该列具有亲和力NONE。

  6.   
  7. 如果列的声明类型包含任何字符串" REAL"," FLOA"或" DOUB"然后该列具有REAL亲和力。

  8.   
  9. 否则,亲和力为NUMERIC。

  10.         

    请注意,确定列关联性的规则的顺序是   重要。声明类型为" CHARINT"将两者都匹配   规则1和2,但第一个规则优先,因此列   亲和力将是INTEGER。

当你的列被声明为" string" - 无法导出到一个特定类型的亲和力,SQLite将尽可能从规则5尝试将数据存储为数字。因此,如果值可以转换为数字,则删除前导零

但请注意,您可以存储文本(例如:' T000000084')而不会出现任何问题 - 因为SQLite无法将其转换为数字(首选类型亲和力),它将存储它反而是文字。


鉴于我们的特殊需要,您应该使用 text 亲和力声明您的列。即使用包含字符串CHARCLOBTEXT类型(规则2)的类型。

答案 1 :(得分:1)

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