我正在开发一个跨平台的Python (3.7+)应用程序,并且我需要依赖于SQLite中文本列的排序顺序,这意味着文本值的比较算法必须基于UTF8字节。即使系统编码(sys.getdefaultencoding())不是utf-8。
但是在sqlite3 module的文档中,我找不到用于sqlite3.connect的编码选项。
我读到使用sys.setdefaultencoding("utf-8")是一种丑陋的黑客行为,而且非常不鼓励(这就是为什么我们需要在调用它之前使用reload(sys) )
那么解决方案是什么呢?
发布于 2020-10-08 13:00:34
查看Python的_sqlite/connection.c代码,可以调用sqlite3_open_v2或sqlite3_open (取决于编译标志)。基于sqlite doc,它们都使用UTF8作为默认的数据库编码。我仍然不确定"default“这个词的意思,因为它没有提到任何覆盖它的方法!但是看起来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);
#endifhttps://stackoverflow.com/questions/64254300
复制相似问题