类型
阅读有关 SQLite 3 types 。ASPW始终维护正确的值类型,并且从不将它们转换为其他类型。但是请注意,SQLite可能会将基于列关联性的类型转换为 described 。ASPW要求提供的所有值都是相应的Python/SQLite类型(或子类)之一。
映射
Python中的None在SQLite中为空
在SQLite中,Python int是整数。表示的值必须符合64位有符号数量(C级别的长整型),否则会生成溢出异常。
在SQLite中,Python的FLOAT类型用于REAL。(在C级别,它们都是8字节量,没有精度损失)。
使用了str(Unicode)类型。
虽然您可以使用任何符合 buffer protocol
UNICODE
所有SQLite字符串都是Unicode。实际的二进制表示形式可以是UTF8或UTF16。ASPW使用SQLite的UTF8接口,这导致数据库中的二进制字符串表示也缺省为UTF8。所有这些对于您的Python代码来说都是完全透明的。
无论在哪里使用字符串(例如,作为数据库值、SQL语句、绑定名称、用户定义的函数),您都可以使用Unicode字符串作为Python字符串类型。
从SQLite返回文本值时,ASPW始终使用Python Unicode类。
如果您对Unicode了解不多,请阅读 Joel's article 。SQLite不包括从随机非Unicode编码到Unicode的转换或从Unicode到Unicode的转换。(它确实包括8位和16位Unicode编码之间的转换)。
如果您不想使用Unicode,而是希望简单的字节输入是相同的字节输出,那么您应该只使用BLOB。
如果您想要对Unicode文本进行操作,例如大小写或排序,那么您需要了解区域设置。这是因为完全相同的字符序列根据您所在的位置进行不同的排序、大写、小写等。例如,突厥语有多个字母I,德语中有ç,它的行为像ss,不同的欧洲国家不同的口音排序不同。幸运的是,您可以要求一个库来做正确的本地化工作 ICU 。默认的SQLite编译只处理26个字母的罗马字母。如果您使用SQLite启用ICU,则您将获得 good stuff 。请参阅 Building C and C++ Extensions 一节介绍如何为带有APSW的SQLite启用ICU。请注意,Python目前不包括ICU支持,因此排序、大小写等都是有限的,并且不考虑区域设置。
总之,永远不要将字节与字符串混淆(遗憾的是,C语言将其视为一回事)。要么始终对所有内容使用字节(和SQLite BLOB),要么对所有内容使用字符串(和SQLite字符串)。如果您采用后一种方法并且必须处理外部输入/输出,那么您必须知道正在使用什么编码,并且最好在输入时尽早转换为Unicode,在输出时尽可能晚地转换为Unicode。