我们的 Web 应用程序将 UTF-8 编码的数据存储在 VARCHAR 字段中。最近,我们使用 DataDirect 的 OpenAccess ODBC 驱动程序为客户提供了通过 ODBC 访问这些数据的权限。这是使用 DataDirect 的 OpenAccess SDK 实现的,它编写了一个 C# .Net 类来与服务交互。我们只允许客户执行 SELECT 查询。我们目前还将结果限制为 100K 行。
这个解决方案真的很好用,除了查询带有一些编码数据的字段对用户来说是乱码,这是可以理解的。在我们服务的下一个版本中,我想为用户提供使用未编码字符串进行查询的能力,然后查看未编码的结果。
我已经通过对传入查询进行 UTF-8 编码解决了这个问题,然后通过标记 VARCHAR 字段返回未编码的结果是 WVARCHAR。这实际上工作得很好。但是,这确实意味着每个 VARCHAR 列都以 WVARCHAR 形式返回,尽管存在(或缺少)Unicode 字符。
此时我们的很多客户都采用了在自己的SQL Server实例上在SSMS中创建链接服务器的方法,这是我首选的连接方法。由于我们的服务将结果限制为 100K 行,我鼓励大家使用 OPENQUERY 来执行查询。不过,似乎我在 SSMS 中的链接服务器的配置中缺少一些东西。当对这些 WVARCHAR 列执行字符串函数(例如 LEFT、RIGHT、SUBSTRING)时,SSMS 返回以下错误:
链接服务器“LOCAL”的 OLE DB 提供程序“MSDASQL”返回消息“不支持请求的转换。”。消息 7341,级别 16,状态 2,第 1 行无法从链接服务器“LOCAL”的 OLE DB 提供程序“MSDASQL”获取列“[MSDASQL].ColName”的当前行值。
这将针对如下查询返回:
SELECT *
FROM OPENQUERY([LOCAL], '
SELECT LEFT(FirstName, 2) AS ColName
FROM dbo.User
')
LEFT
如果我要从此查询中删除该函数,则会返回 FirstName 列,并正确解码,没有错误。
此问题不会影响例如 MS Excel 中的查询。从表面上看,当我通过与 DataDirect 产品接口的 .Net 类进行调试时,字符串似乎受到了它们各自功能的适当影响。我试图更改链接服务器属性上的所有服务器选项,但我没有找到正确的组合。我只是在寻找合适的树在这里吠叫。是我对结果的处理,将它们更改为 WVARCHAR 吗?还是我的 SSMS 链接服务器的某些属性需要更改而我丢失了?