将 Openquery 中的丹麦字符 (Æ Ø Å) 保留到链接服务器

Posted

技术标签:

【中文标题】将 Openquery 中的丹麦字符 (Æ Ø Å) 保留到链接服务器【英文标题】:Keep danish characters (Æ Ø Å) in Openquery to linked server 【发布时间】:2017-02-15 08:50:09 【问题描述】:
select * from openquery(DATABASENAME_LINKED, 'select id, pe_department_id, pe_username, pe_name, pe_hours, pe_startpage, pe_admin from person')

此查询中丢失了特殊字符。是否可以在代码或其他地方确保某种编码?

【问题讨论】:

链接了哪个服务器(另一个 mssql,或 oracle,db2,...)?什么是列数据类型? social.msdn.microsoft.com/Forums/sqlserver/en-US/… 我认为这是一个 mysql 数据库。数据类型很可能是 varchar 可能需要配置“排序规则兼容”和“排序规则名称”设置,或者将 varchars 转换为 nvarchar,请参阅上一页的 MSDN 文章。评论。角色发生了什么?用问号代替,或省略,或 Å > A? 例如,Ø 被转换为“ø”。我尝试根据您的链接将 pe_name 转换为 nvarchar(1000)(谢谢),但出现错误。我怎么弄乱你提到的设置? 链接服务器的配置是什么?你用什么作为 MySQL 的适配器?这里的部分问题是 MySQL 使用 UTF-8 而 SQL Server 的 nvarchar 是 UTF-16。因此,一些翻译工作是必要的,理想情况下,您的链接服务器驱动程序会为您完成。 【参考方案1】:

从this article 重新调整函数UTF8_TO_NVARCHAR 的用途,可以即时进行转换:

SELECT 
    id,
    pe_department_id,
    dbo.UTF8_TO_NVARCHAR(cast(pe_name AS varchar(MAX))) pe_name,
    pe_hours,
    pe_startpage,
    pe_admin
FROM OPENQUERY(
    DATABASE_LINKED,
    'select
        id,
        pe_department_id,
        pe_name,
        pe_hours,
        pe_startpage,
        pe_admin 
    from person'
)

在传递查询中使用 MySQL 的 CHARSET 指令强制转换列的更直观方法失败,没有有用的错误描述,因此我们没有进一步研究。

【讨论】:

遗憾的是,我收到“查询完成但出现错误”,并且没有 ucs2 的错误描述,utf16 的“未知字符集”。另外:“无法从链接服务器“DATABASE_LINKED”的 OLE DB 提供程序“MSDASQL”获取列信息。 和 pe_name 绝对是正确的。 如果您可以访问 mysql 数据库,您可以尝试直接在 mysql 上运行内部查询(使用演员表)。如果成功,请查看它并尝试从中选择。 我找到了一个解决问题的函数的链接:***.com/questions/28168055/…。所以现在代码看起来像这样: SELECT id , pe_department_id , DATABASE.dbo.UTF8_TO_NVARCHAR (cast(pe_name AS varchar(MAX))) , pe_hours , pe_startpage , pe_admin from openquery(DATABASE_LINKED,'select id, pe_department_id, pe_name, pe_hours, pe_startpage, pe_admin from person')

以上是关于将 Openquery 中的丹麦字符 (Æ Ø Å) 保留到链接服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xsl:sort 与外来字符(即“æ”、“ø”和“å”)

带有 Easy APN 的丹麦语字符

ÆØÅ 在 MySQL 中无法正确显示

使用 std::wifstream 读取带有特殊字符的 unicode 文件

JavaMail:“域包含字符串中的控件或空格”错误消息,因为域包含丹麦字符

返回的 JSON 结果中的 Æøå - 数据看起来不像它应该的那样