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


本文整理自网络,侵删。

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

相关阅读 >>

Delphi 判断奇数偶数

Delphi 缩放图形打印输出

Delphi createmessagedialog

Delphi 临时文件路径(支持安卓、ios)

Delphi 10.x ide界面

Delphi 结构化文件存取

Delphi截取技巧 lastdelimiter

Delphi idhttp 获取链接连通状态

Delphi实现qq右下角弹出信息窗口

Delphi 数据类型列表

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...