目前,我正在将我们所有的 Delphi 2007 代码库更新到 Delphi XE2。最大的考虑是 ANSI 到 Unicode 的转换,我们通过将所有基本类型(char/string)重新定义为 ANSI 类型(ansichar/ansistring)来处理这个问题。这在我们的许多程序中都有效,直到我开始使用数据库。
当我将从文件读取的信息存储到 SQL Server 2008 数据库中的程序转换时,问题就开始了。突然间,使用字符串定位数据的简单查询会失败,例如:
SELECT id FROM table WHERE name = 'something'
该name
字段是一个varchar
. 我发现我可以通过在字符串名称前加上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 个空字符存储在数据库中的。