Python 用二进制表示法设计数据库
我想澄清这一点,因为我肯定不是数据库专家,可能弄错了 我的任务是设计一个小的地址簿数据库,使用任何语言的简单二进制表示法,如姓名、电话号码等 我在想我需要创建一个数据库,比如说用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'),
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作为第二次出现的列类型的一部分テスト. 我应该发布链接的