SQLite - windows 平台的首选编码
SQLite - preferable encoding for windows platform
我为 Windows 开发了 C++ 应用程序。
我将使用 SQLite 3 来存储:
- 硬盘上不同文件的路径
- 来自 GUI 界面的字符串(最初对于此类字符串可以使用任何编码 - 英语、西班牙语、中文等)
- 不同的 ASCII 字符串
我想在包含文件路径字符串的列上建立唯一索引。但这不是必需的 - 我可以通过我的 C++ 代码来完成。
我应该使用什么编码 - UTF-8、UTF-16le 或 UTF-16be?
P.S。
SQLite 有 3 个打开数据库的函数:sqlite3_open
、sqlite3_open16
、sqlite3_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
函数才有意义。
我为 Windows 开发了 C++ 应用程序。
我将使用 SQLite 3 来存储:
- 硬盘上不同文件的路径
- 来自 GUI 界面的字符串(最初对于此类字符串可以使用任何编码 - 英语、西班牙语、中文等)
- 不同的 ASCII 字符串
我想在包含文件路径字符串的列上建立唯一索引。但这不是必需的 - 我可以通过我的 C++ 代码来完成。
我应该使用什么编码 - UTF-8、UTF-16le 或 UTF-16be?
P.S。
SQLite 有 3 个打开数据库的函数:sqlite3_open
、sqlite3_open16
、sqlite3_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
函数才有意义。