AbsoluteDatabase 控件中的 String 与 WideString 比较(原创)

AbsoluteDatabase 是 Delphi 下比较好用的单机数据库控件,在设计表时,要注意 String 与 WideString 字段类型的区别:

一、测试准备

用以下SQL创建测试表:

DROP TABLE t1;
CREATE TABLE t1 (
  Id AUTOINC,
  EName VARCHAR(8),
  CName WIDESTRING(4), 
  PRIMARY KEY ixMan (Id)
);
INSERT INTO t1 (Id, EName, CName) values (1, '张旭', '张旭');
INSERT INTO t1 (Id, EName, CName) values (2, '李白', '李白');
INSERT INTO t1 (Id, EName, CName) values (3, '老黑', '老黑');
INSERT INTO t1 (Id, EName, CName) values (4, '大江', '大江');
INSERT INTO t1 (Id, EName, CName) values (5, '李斯', '李斯');
INSERT INTO t1 (Id, EName, CName) values (6, '马刚', '马刚');
INSERT INTO t1 (Id, EName, CName) values (7, '小红', '小红');

二、测试过程

SQL排序

比较 AbsoluteDatabase 引擎对 String 与 WideString 类型的排序结果:

select * from t1 order by ename;
select * from t1 order by cname;

以上两语句得到相同的排序结果:4 3 2 5 6 7 1,说明 AbsoluteDatabase 引擎对 String 与 WideString 类型的中文字符串都可以正确排序,因此,没有必要使用 WideString类型

SQL筛选

select * from t1 where Ename like '%李%';
select * from t1 where Came like '%李%';

对 EName 字段查询返回 7 条记录,对 CName 字段正确查询返回 2 条记录,说明 AbsoluteDatabase 引擎对 WideString 字段的中文筛选支持较好,对 String 字段的中文查询有缺陷。

cxGrid 支持测试

(基于 DevExpress VCL 2012 vol 1.5)

排序

在 DevExpress 的 cxGrid 连接到 AbsoluteDatabase 数据表后,单击列标题,对 String 类型的 EName 列可以正确排序,对 WideString 类型的 CName 列反而无法正确排序。

筛选

在 DevExpress 的 cxGrid 连接到 AbsoluteDatabase 数据表后,在 Custom Filter 中分别使用 %李% 对 EName 列和 CName 列筛选,均正确返回 2 行数据。

结论

SQL排序 SQL筛选 cxGrid排序 cxGrid筛选
String ×
WideString ×

WideString 类型的另一个弊端是:本来预期最多保存4个汉字,把 WideString 列的长度设置为 4,但是 DevExpress 控件库的 MaxLength 属性对 WideString 类型不兼容,在 DevExpress 控件中,只能录入 2 个汉字。要想在 DevExpress 控件中保存 4 个汉字,或者定义长度为 8 的 String 类型,或者定义长度为 8 的 WideString 类型,WideString 类型的优势荡然无存了。
所以最后的结论是:如果 Delphi7 配合 DevExpress 控件使用,字段中要保存汉字,那么直接将长度定义成最多汉字数量 2 倍的 String 列类型是最优方案。

补充

以上测试基于 Delphi7 + DevExpress VCL 2012 vol 1.5,在 Delphi10.3 和 DevExpress VCL v23 下,MaxLength 的问题已解决,字段类型为 String(8) 时,可以输入8个英文字符或汉字,WideString(4)可以输入4个英文字符或汉字,可以认为在此环境下,String 类型与 WideString 类型是等效的。在 cxGrid 23 中,无论是对 String 类型的 EName 列还是 WideString 类型的 CName 列,单击列标题排序结果都不正确。在 Custom Filter 中分别使用 %李% 对 EName 列和 CName 列筛选,均正确返回 2 行数据。

posted @ 2024-10-28 21:08  汉学  阅读(24)  评论(0)    收藏  举报