使用ASQLite3组件时:
将中文保存到ansichar 字段.有些情况正常,有些情况不正常.建议将中文保存到unicode 字段.
使用tdbgrid+TASqlite3Table保存,显示正常.
使用TASqlite3Query SQl语句直接插入values('中文'),在tdbgrid中显示乱码.
使用params.ParamByName('memo').AsAnsiString := '中文';在tdbgrid中显示正常
或Params[0].AsAnsiString :='中文';在tdbgrid中显示正常
模糊查询中的ansi字段,直接写like "汉字%",测试无结果
like :v1
Params[0].AsAnsiString :="汉字%";测试无结果
结论:不支持模糊查询中的ansi字段
Update ansiString 字段正常.
with ASQLite3Query2 do begin
Close;
SQL.Clear;
SQL.text:=('update animal set memo= :v1 where id = 3');
Params[0].AsAnsiString := '中文德育';
ExecSql;
end
where子句中包含ansiString 字段 无结果
with ASQLite3Query1 do begin
Close;
SQL.Clear;
SQL.text:=('select * from animal where memo = :v1');
Params[0].AsAnsiString := '中文德育';
Open;
end;
将中文保存到unicode字段正常.
修改ASQLite3D2010 支持中文显示
ftp://download:CXf0yACUFZY5@2ccc.com/vcl/database/ASqlite3Delphi2010.rar
TASqlite3Query 使用unicode. AsString正常, 2009.12
呵呵,修改ASQLite一下支持中文,就改一个函数进去。
在TASQLite3DB.SQLite3_GetNextResult 对ftString类型处理,其它的没做处理,谁有空可以去处理ftMemo及其他数据类型,还有SQLite3_Column_text16我也没处理。
//pData := PAnsiChar(SQLite3_Column_text(TheStatement, I));
pData := PAnsiChar(WideStringToString(UTF8Decode(SQLite3_Column_text(TheStatement, I)),CP_ACP));//936));
评论上述修改没有太大意义,而且TAsqlite3Table 使用unicode. AsString仍不正常.
即使不改SQLite3_GetNextResult ,按照下面的来也可以.关键在于
类型
procedure GetFieldInfo(FieldInfo: string; var FieldType: TFieldType;
if (vt = 'varchar') or (vt = 'ansichar') or(vt='varAnsiChar') or (vt = 'AnsiChar') or (vt = 'varAnsiChar2') then begin
FieldType := ftString;
FieldLen := StrToInt(Copy(FieldInfo, p1 + 1, p2 - p1 - 1));
end else if (vt = 'nvarchar') or (vt = 'widechar') or (vt = 'nvarAnsiChar') or (vt = 'nAnsiChar') or (vt = 'nvarAnsiChar2') then begin
设置数据
procedure TASQLite3BaseQuery.SetFieldData(Field: TField; Buffer: Pointer);
..................
if Field.DataType = ftWideString then
begin
MyWBuf := PWideChar(Buffer);
//MyBuf :=PAnsiChar(UTF8Encode(StringToWideString(CP_ACP,PAnsiChar(Buffer)))) ;
Move(MyWBuf[1], (DestBuffer + GetFieldOffset(Field.FieldNo))^, Length(MyWBuf)*2+2) // GPA - Warning UTF-8 length can be potentially > length
end
........................
function TASQLite3DB.SQLite3_ExecSQL(TheStatement: string; Fields : TFields): integer;
..........
else if MyField.DataType = ftWideString then
SQLite3_Bind_Text16(p, b, PWideChar(MyField.Text), Length(MyField.AsString)*2, SQLITE_TRENT)
修改后 TAsqlite3Table 使用unicode. AsString正常.
TAsqliteDB.CharacterEncode:=STANDARD;
将数据类型设置为nvarchar.
with ASQLite3Query2 do begin
Close;
SQL.Clear;
SQL.Add('insert into animal (id, desc) values (61, "中文")');
ExecSQL;
测试正常
中文的模糊查询:
select * from 表名 where 字段名 like "汉字%"
select * from 表名 where 字段名 like "%字%"
select * from 表名 where 字段名 like "汉%"
测试正常
中文路径
DB1.Database :=('中文.sqb');
测试正常
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TASqlite3Query 使用unicode. AsString仍不正常, 2009.02
现把改动细节列出来给大家参考:
1、asqlite_def文件中增加D2010和D2009支持
{$IFDEF VER210}
{$DEFINE ASQLite_D2PLUS}
{$DEFINE ASQLite_D3PLUS}
{$DEFINE ASQLite_D4PLUS}
{$DEFINE ASQLite_D5PLUS}
{$DEFINE ASQLite_D6PLUS}
{$DEFINE ASQLite_D7PLUS}
{$DEFINE ASQLite_D2005PLUS}
{$DEFINE ASQLite_D2006PLUS}
{$DEFINE ASQLite_D2009PLUS}
{$DEFINE ASQLite_D2010PLUS}
{DELPHI10}
{$B-}{$X+}{$T-}{$H+}
{$DEFINE ASQLite_DYNARRAY}
{$ENDIF}
{$IFDEF VER200}
{$DEFINE ASQLite_D2PLUS}
{$DEFINE ASQLite_D3PLUS}
{$DEFINE ASQLite_D4PLUS}
{$DEFINE ASQLite_D5PLUS}
{$DEFINE ASQLite_D6PLUS}
{$DEFINE ASQLite_D7PLUS}
{$DEFINE ASQLite_D2005PLUS}
{$DEFINE ASQLite_D2006PLUS}
{$DEFINE ASQLite_D2009PLUS}
{DELPHI10}
{$B-}{$X+}{$T-}{$H+}
{$DEFINE ASQLite_DYNARRAY}
{$ENDIF}
2、PAS文件修改(ASGSQLite3.pas)
主要是因为D2010中的一些变动:
数据类型变动
string类型:在D2010中string类型相当于WideString而不是原有的AnsiString类型
PChar类型:D2010中Char类型相当于WideChar而不是AnsiChar,所以PChar类型也变动了
父类TDataSet中类型定义变动:
Bookmark:Bookmark原为Pointer类型,在D2010中改为了TBookmark类型,这是一个Byte类型的数组,估计是为了解决内存泻漏问题而作的改动。
Record Buffer:Buffer原为PAnsiChar,在D2010中改为TRecordBuffer,这个一个PByte类型。
具体改动位置大家可以查看代码中{$IFDEF ASQLite_D2010PLUS}{$ELSE}{$ENDIF}部份。