我有一个 MS SQL Server 2019 表,其中有一个名为“Char”的列,它被定义为 nvarchar(4)。
在我的示例 Delphi 10.3.3 代码中,我有一行说:
found := ADODataSet1.Locate('Char', '⓪', []);
表中没有具有这样值的记录,但是当我执行代码时,Locate 返回 True 并定位到结果集中的第一条记录。如果我添加具有该值的记录,Locate 仍然返回 True,但定位到结果集中的第一条记录,而不是具有所需字符的记录。
使用 ASCII 字符,代码按预期工作。
更新:
我表中的第一条记录在 Char 列中有“0”。如果我删除它,那么定位“⓪”返回 False。如果我添加“⓪” 到表然后定位找到那个,但如果同时包含“⓪”和“0”,那么它会找到ASCII数字。如果我尝试定位“②”,它会返回包含“2”的记录。顺便说一下,Char 列是表上的唯一索引。
重现问题的步骤。
SQL Server 2019,默认美国安装
创建表
创建表 [dbo].[Things]( [Thing] nvarchar NOT NULL ) ON [PRIMARY]
我用 TADODataSet、TMemo 和 TButton 创建了一个 VCL 应用程序
这是按钮的代码:
procedure TForm2.Button1Click(Sender: TObject);
{} procedure Add2Table(aString: string);
begin
with ADODataSet1 do begin
Insert;
FieldByName('Thing').AsString := aString;
Post;
Memo1.Lines.Add('Added: ' + aString);
end;
end;
const
cTarget = '①';
begin
with ADODataSet1 do begin
Close;
CommandText := 'Select * from Things';
Open;
Memo1.Clear;
Memo1.Lines.Add('RecordCount ' + IntToStr(RecordCount));
Add2Table('0');
Add2Table('1');
Add2Table('2');
Add2Table('⓪');
Add2Table(cTarget);
Add2Table('②');
Close; Open;
Memo1.Lines.Add('Trying to locate: ' + cTarget);
if Locate('Thing', cTarget, []) then
Memo1.Lines.Add(Format('Found %s in record %d', [
FieldByName('Thing').AsString, Recno]))
else
Memo1.Lines.Add('Not found');
end;
end;
当程序运行时,它没有找到目标字符“①”,而是找到了“1”。