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中字段的collation是什么? 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 中文字符导入为“?”的主要内容,如果未能解决你的问题,请参考以下文章
通过 SQLCMD 将 sql 文件从 MySQL 导入 MS SQL 时语法不正确