SQLite - windows 平台的首选编码

SQLite - preferable encoding for windows platform

我为 Windows 开发了 C++ 应用程序。

我将使用 SQLite 3 来存储:

我想在包含文件路径字符串的列上建立唯一索引。但这不是必需的 - 我可以通过我的 C++ 代码来完成。

我应该使用什么编码 - UTF-8、UTF-16le 或 UTF-16be?


P.S。 SQLite 有 3 个打开数据库的函数:sqlite3_opensqlite3_open16sqlite3_open_v2。 似乎对于 Windows 我必须使用 sqlite3_open16 因为路径可能包含非 ACSII 符号。对吗?

UTF-16le

由于 windows API 在内部使用它,如果您使用其他任何东西,那么每个 windows API 调用都会有进行转换的开销。如果您有很多 windows API 长字符串调用,这可能会变得很重要。

在大多数情况下这不是什么大问题。我建议选择一个,然后将精力和时间集中在其他影响更大的问题上。


"Seems that for Windows I have to use sqlite3_open16 because path may contain non-ACSII symbols"

是的。这也会将数据库中的默认编码设置为 UTF16。 https://www.sqlite.org/c3ref/open.html

只需使用默认的 UTF-8。

各种 UTF-16 编码浪费 space(除非数据库中的绝大多数文本是非 ASCII),这需要更多 I/O,这会使一切变得更慢。 此外,大多数 16 函数将其参数 from/to 转换为 UTF-8,然后调用使用 UTF-8 的内部函数,因此它们总是比较慢。

虽然名称中带有 16 的函数接收 return UTF-16 字符串,但这与数据库的实际编码无关(所有函数都将 from/to UTF-8 或 UTF -16 根据需要)。

函数没有 16使用UTF-8,这只是一种不同的编码。在这两种情况下,您可以使用的字符集完全相同,并且 SQL 的行为始终相同。

某些功能(例如 sqlite3_open_v2)在 16 版本中不可用。

仅当您出于其他原因被迫使用 UTF-16 字符串并且无论如何都必须转换时,使用 16 函数才有意义。