我为Windows开发c ++应用程序。
我将使用SQLite 3来存储:
我想在文件pathstring列上具有唯一索引。 但这不是必需的 – 我可以通过我的c ++代码来完成。
我应该使用什么编码 – UTF-8,UTF-16le或UTF-16be?
PS SQLite有3个函数来打开DB: sqlite3_open
, sqlite3_open16
, sqlite3_open_v2
。 似乎对于Windows我必须使用sqlite3_open16
因为path可能包含非ACSII符号。 这样对吗?
只要使用UTF-8,这是默认的。
各种UTF-16编码浪费空间(除非DB中绝大多数文本是非ASCII的),这需要更多的I / O,这使得一切都变得更慢。 此外,大多数16
函数将它们的参数从/转换为UTF-8,然后调用一个使用UTF-8的内部函数,所以它们总是比较慢。
虽然名称中包含16
函数接收并返回UTF-16字符串,但这与数据库的实际编码无关(所有函数根据需要从/转换为UTF-8或UTF-16)。
没有 16
函数使用UTF-8,这只是一个不同的编码。 在这两种情况下,您可以使用的字符集完全相同,并且SQL始终表现相同。
一些函数(例如, sqlite3_open_v2
)在16
版本中不可用。
只有当你因为其他原因被迫使用UTF-16字符串时,使用这16
函数才有意义,并且不得不进行转换。
UTF-16LE
由于Windows API在内部使用了这个功能,所以如果你使用其他的东西,那么每个Windows API调用都会有转换的开销。 如果你有很多的Windows API调用长字符串,这可能会变得很重要。
在大多数情况下这不是什么大问题。 我建议选择一个,然后把精力和时间放在影响更大的其他问题上。
“看来,对于Windows,我必须使用sqlite3_open16因为路径可能包含非ACSII符号”
是。 这也将DB中的默认编码设置为UTF16。 https://www.sqlite.org/c3ref/open.html