目前,我正在将我们所有的Delphi 2007代码库更新到Delphi XE2。最重要的考虑因素是ANSI到Unicode的转换,我们通过重新定义所有基本类型(char/string)为ANSI类型(ansichar/ansistring)来处理这个问题。在我们的许多程序中,这已经起作用了,直到我开始与数据库一起工作。
问题始于我转换一个从文件读取信息并存储到SQL Server 2008数据库的程序。突然间,使用字符串定位数据的简单查询失败了,例如:
SELECT id FROM table WHERE name = 'something'
name
字段是一个varchar
类型。我发现在字符串name
前面加上N
前缀后,查询可以成功执行。我原本以为varchar
只能存储ANSI字符,但它似乎也可以存储Unicode字符?更多信息:Delphi中的
name
字段是string[13]
类型,但我已尝试删除了[13]
。数据库排序规则为SQL_Latin1_General_CP1_CI_AS
。我们使用ADO来接口连接数据库。连接信息存储在ODBC管理器中。注意:通过Panagiotis的指导,我已解决了实际问题。我们从映射文件中读取的名称是
array[1..24] of AnsiChar
类型。这个值被隐式转换为string[13]
类型,其中包含空字符。因此,一个有5个字符的名称实际上被存储为5个字符+8个空字符在数据库中。