MS SQL - MySQL - Openquery 中文字符导入为“?”

Posted

技术标签:

【中文标题】MS SQL - MySQL - Openquery 中文字符导入为“?”【英文标题】:MS SQL - MySQL - Openquery Chinese characters imported as '?' 【发布时间】:2017-01-03 11:25:17 【问题描述】:

我正在将数据从 mysql 数据库导入 Microsoft SQL Server 数据库 (SQL_Latin1_General_CP1_CI_AS)。我将基于 OBDC 的链接服务器连接与 Openquery 语句结合使用。

我使用以下 MS SQL 语句:

 SELECT street_address FROM openquery(MYLINKEDSERVER,'SELECT street_address FROM customers')

部分地址包含汉字,使用openquery时这些是作为问号导入的,示例结果:

??? ??? 74 ????501?

我尝试使用 latin1 进行转换 - 不走运;

 SELECT * FROM openquery(MYLINKEDSERVER,'SELECT convert(street_address using latin1) FROM customers')

任何想法如何将汉字导入MS SQL?

【问题讨论】:

street_address 的数据类型是什么,是nvarchar 吗? mysql中的数据类型是varchar 在 SQL Server 中应该是nvarchar 您无法使用Latin1 代码页阅读中文字符!字段的类型是什么?它应该是 UTF8。另外,你是如何设置链接服务器的?什么是连接设置?代码页翻译是否激活? MySQL中字段的collat​​ion是什么? MySQL中所有文本字段均为varchar,Unicode标记为UTF8 【参考方案1】:

有两种 ODBC 驱动程序,一种是 ANSI (myodbc5a.dll),另一种是 Unicode (myodbc5w.dll)。 ANSI 驱动程序将始终返回 varchar 数据。您需要使用 Unicode 驱动程序才能将中文字符作为 Unicode 返回。

查看ODBC驱动安装页面上的relevant paragraph和this related question。

从一个代码页转换为另一个代码页时,未知或无法表示的字符将替换为 ? 或 Unicode 替换字符 �。字符串中的此类字符是尝试进行错误转换的确定信号。

【讨论】:

【参考方案2】:

所以我设法让它工作。

    在 MySQL 中转换为二进制 通过 openquery 在 SQL Server 中导入 在 SQL Server 中转换为 varchar(max) 使用函数将 varchar UTF8 转换为 Nvarchar --> link

结果查询;

SELECT dbo.func_utf_string(cast(bin AS varchar(MAX))) from openquery(MYLINKEDSERVER,'SELECT cast(street as binary) as bin from customers')

【讨论】:

如何在 MySQL 端转换为 UTF8 并在 SQL Server 上保持原样,即nvarchar?您的原始查询使用了latin1。如果强制转换为 bin 有效,那是因为数据是 NOT Latin1 而是 UTF8。驱动程序知道如何将 UTF8 转换为 Unicode。 驱动程序还知道如何将任何代码页转换为Unicode,前提是在源代码中使用了正确的代码页。当使用错误的代码页时,无效字符将替换为?。例如,如果中文存储在带有Latin1 排序规则的表中,则转换失败。源列不是 UTF8,您也破坏了转换。 如果我将其保留为 UTF8,则选择返回不支持中文字符的 varchar。链接服务器中的代码页翻译是我尚未测试但会调查的内容。 TY 这就是为什么我询问了 cmets 中的连接设置。 ADO.NET/OLEDB 驱动程序具有在编码和 Unicode 之间转换的自动转换设置。另一方面,ODBC 驱动程序有 Unicode (myodbc5w.dll) 和 ANSI 版本 (myodbc5a.dll)。 将 odbc 驱动程序更改为 Unicode,这成功了。标记为答案并且不接受。 TY

以上是关于MS SQL - MySQL - Openquery 中文字符导入为“?”的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MS SQL 查询转换为 MySQL 查询

将 MS SQL 存储过程移植到 MySQL

通过 SQLCMD 将 sql 文件从 MySQL 导入 MS SQL 时语法不正确

MS SQL - MySQL - Openquery 中文字符导入为“?”

将 mysql 查询转换为 MS SQL

跟踪从 MS Access 到 MySQL 的 SQL 调用