RSS订阅 | 匿名投稿
您的位置:网站首页 > 数据库 > 正文

delphi xe 使用ASQLite操作SQLite数据库乱码

作者:admin 来源: 日期:2013/3/31 16:15:46 人气: 标签:

问题说明
默认情况下,由程序创建的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的字符串。
但事情不是这样的。


读完这篇文章后,您心情如何?
0
0
0
0
0
0
0
0
本文网址: