问题说明
默认情况下,由程序创建的SQLite数据库以UTF16le编码存储,这可以使用文本编辑器直接打开数据库文件,并以16进制格式查看,中文、英文和数字都以双字节存储(包括DDL)。
在默认情况下,程序写入的中文数据通过ASQLite读取出来时显示为乱码,无论读取到DBGrid或者读取到字符串,无论TASQLite3DB::CharacterEncoding设为STANDARD还是UTF8。
在XP下用RAD Studio 2007开发时,数据库文件以UTF8编码存储,但通过ASQlite3程序写入的中文是以ANSI存储的(因此通过SQLite Expert Persional查看时,需要将编码格式设置为ANSI)。
问题解释
SQLite数据库文件的编码格式如果不通过PRAGMA指令指定,则以RAD Studio 2007编译的程序创建的数据库文件为UTF8编码,以RAD Studio 2010编译的程序创建的数据库文件为UTF16le编码。
以RAD Studio 2007编译的程序以ANSI写入数据到数据库中,读出来也是ANSI。
以RAD Studio 2010编译的程序以UTF16le写入数据到数据库中,读出来就是乱码了。
这个版本的ASQLite3的TASQLite3DB::CharacterEncoding属性不起作用。
暂时解决办法
通过 PRAGMA encoding = "UTF-8"; 指定数据库使用UTF8编码。
设置TASQLite3DB::CharacterEncoding="UTF8";(起始没什么用)
字符串以ANSI格式写入数据库,即aQuery->Params->ParamByName("Content")->AsAnsiString = anAlert.GetContent();
正常读取数据,即String Content = aQuery->FieldByName("Content")->AsString;。
按道理...
数据库指定编码格式为UTF8,并设置TASQLite3DB::CharacterEncoding="UTF8";,那么就应该以UTF8写入数据(即中文以3个字节存储),读出来的时候自动将UTF8转换成Unicode的字符串。
但事情不是这样的。
关键字词: