我正在开发一个跨平台Python(3.7+(应用程序,我需要依赖SQLite中TEXT列的排序顺序,这意味着TEXT值的比较算法必须基于UTF-8字节。即使系统编码(sys.getdefaultencoding()
(不是utf-8
。
但是在sqlite3模块的文档中,我找不到sqlite3.connect
的编码选项。
我读到sys.setdefaultencoding("utf-8")
的使用是一种丑陋的黑客攻击,非常令人沮丧(这就是为什么我们需要在调用它之前使用reload(sys)
(
那么解决方案是什么呢?
查看Python的_sqlite/connection.c代码,会调用sqlite3_open_v2
或sqlite3_open
(取决于编译标志(。基于sqlite-doc,两者都使用UTF-8作为默认的数据库编码。我仍然不确定";默认";因为它没有提到任何覆盖它的方法!但我觉得Python不能用另一种编码打开。
#ifdef SQLITE_OPEN_URI
Py_BEGIN_ALLOW_THREADS
rc = sqlite3_open_v2(database, &self->db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
(uri ? SQLITE_OPEN_URI : 0), NULL);
#else
if (uri) {
PyErr_SetString(pysqlite_NotSupportedError, "URIs not supported");
return -1;
}
Py_BEGIN_ALLOW_THREADS
rc = sqlite3_open(database, &self->db);
#endif