Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用二进制表示法设计数据库_Python_Sqlite - Fatal编程技术网

Python 用二进制表示法设计数据库

Python 用二进制表示法设计数据库,python,sqlite,Python,Sqlite,我想澄清这一点,因为我肯定不是数据库专家,可能弄错了 我的任务是设计一个小的地址簿数据库,使用任何语言的简单二进制表示法,如姓名、电话号码等 我在想我需要创建一个数据库,比如说用Python,并以二进制格式存储数据,所以我写了这个 import sqlite3 as lite con = lite.connect('address_book.db') cur = con.cursor() users = ( (1, 'USER1', 'Surname1', 'Address1'),

我想澄清这一点,因为我肯定不是数据库专家,可能弄错了

我的任务是设计一个小的地址簿数据库,使用任何语言的简单二进制表示法,如姓名、电话号码等

我在想我需要创建一个数据库,比如说用Python,并以二进制格式存储数据,所以我写了这个

import sqlite3 as lite

con = lite.connect('address_book.db')
cur = con.cursor()
users = (
    (1, 'USER1', 'Surname1', 'Address1'),
    (2, 'USER2', 'Surname2', 'Address2'),
)
# Convert all data in users to the binary representation 
new_arr = ()
for i in users:
    tuple_to_append = ()
    for j in i:
        if isinstance(j, int):
            tuple_to_append += (bin(j),)
        elif isinstance(j, str):
            tuple_to_append += (''.join(map(bin, bytearray(j, encoding='utf-8'))),)
    new_arr += (tuple_to_append,)

cur.execute("DROP TABLE IF EXISTS users")
cur.execute("CREATE TABLE IF NOT EXISTS users("
            "user_id INTEGER PRIMARY KEY,"
            "first_name VARCHAR(20) NOT NULL,"
            "last_name VARCHAR(20) NOT NULL,"
            "address VARCHAR(20) NOT NULL)")

cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?)", new_arr)
con.commit()
我走对了吗

我走对了吗

可能在不必要的轨道上,因为文本通常存储在UTF-8中,如果通过sqlite3_open16例程打开连接,则存储在UTF-16中。通常使用UTF-8

也许可以考虑以下几点:-

DROP TABLE IF EXISTS পরীক্ষা ;
CREATE TABLE IF NOT EXISTS পরীক্ষা (name TEXT, altname1 BLOB, altname2 REAL, altname3 VARCHAR(20), altname4 CHARVAR(-20));
INSERT INTO পরীক্ষা VALUES('Test','ტესტი','thử nghiệm','    テスト','ටෙස්ට්');
SELECT * FROM পরীক্ষা;
这里所有的值和表名都是不同语言中的单词Test。上述操作有效,选择的结果为:-

您可能会想,为什么不将非数字保存为实数不会失败,或者按照CHARVAR-20,您怎么会有负数字符

SQlite在列和数据类型方面并不典型。在SQlite中,列类型只是数据类型的指示。在SQLite中,您实际上可以在任何类型的列中存储任何类型的数据,如上所示

事实上,只有5种列类型类型类型关联是SQlite的术语,它们是:-

整数 真实的 文本 斑点 数字的 任何其他可接受的术语,如转换为上述术语之一

评论说,

主键,不是主键

您对INTEGER主键进行了编码,并说:-

但是Python并没有抱怨

上面的类型被视为整数主键

按给定顺序应用的转换规则

如果类型包括INT,则整数关联,因此整数主\u键和主\u键INTEGER一样具有整数关联 如果类型包括CHAR、TEXT或CLOB,则文本关联性因此VARCHAR20和CHARVAR-20的类型关联性为TEXT。 如果类型包括BLOB,则为BLOB关联。 如果类型包括REAL、FLOA或DOUB,则为REAL affinity。 否则为数值关联。
如果使用以下内容定义列テスト テスト 是的,它可以工作,那么亲和性将是数字的,因为列名是テスト 类型是第二部分テスト, 下降到5。否则为数字。

主键,而非主键…@Shawn感谢您的帮助。Python并没有抱怨,但我不确定在任何语言中,直接的二进制表示是什么意思。事实上,数据库格式将其数据存储在一些专门的二进制文件中,而不是文本文件中。但sqlite数据库的真正好处是,它的代码或库已经移植到许多语言中,但这与数据库文件的二进制表示形式没有任何关系。相反,许多语言的可用性来自于许多人有目的的工作,以使sqlite库在许多语言中可用。这是一个类,即家庭作业吗?@CPerkins这实际上是实用程序员新版的挑战之一,我将联系作者以获得更多的澄清。谢谢你的回答!谢谢你提供了非常有用的信息!很清楚为什么会发生在我身上,我不知道Sqlite的这种特殊行为,也不清楚为什么テスト テスト 但定义了一个数字@MikeT@ren这是因为它没有INT、CHAR、TEXT、CLOB、BLOB、REAL FLOAT或DOUB作为第二次出现的列类型的一部分テスト. 我应该发布链接的