SQL Server链接服务器创建语句本身没有“字符集”参数,字符集要在提供程序、连接字符串、驱动环境变量或排序规则选项里指定。 换句话说,sp_addlinkedserver 只是把远程数据源挂进来,真正决定中文、日文、Emoji 能否正常进出的,是 OLE DB、ODBC、Oracle 客户端或 MySQL 驱动这一层。
SQL Server链接服务器字符集怎么指定:先看三层控制点
链接服务器创建语句最小模板
一条典型的创建语句通常分两步,先注册远程数据源,再映射登录名。
EXEC sp_addlinkedserver
@server = 'MYSQL_LS',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@datasrc = 'MySQL_DSN',
@provstr = 'DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=10.0.0.8;PORT=3306;DATABASE=report;CHARSET=utf8mb4;',
@catalog = 'report';
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'MYSQL_LS',
@useself = 'FALSE',
@rmtuser = 'readonly',
@rmtpassword = '你的密码';
测试连接时,不要一上来就写四部分命名查询,先用 OPENQUERY 验证远程端能不能返回中文:
SELECT FROM OPENQUERY(MYSQL_LS, 'SELECT id, name FROM user_profile LIMIT 5');
字符集到底由谁决定
链接服务器的字符集不是 SQL Server 单方面说了算,它通常受三层影响:
- 提供程序层:MSDASQL、MSOLEDBSQL、OraOLEDB.Oracle、SQLNCLI 等,支持的字符集能力不同。
- 连接字符串层:MySQL ODBC 可写 charset=utf8mb4,PostgreSQL ODBC 可写 Unicode,Oracle 更多依赖 NLS_LANG。
- SQL Server 排序规则层:本地库、远程库、临时表之间排序规则不一致,容易报 collation conflict。
据微软官方文档,SQL Server 到 SQL Server 的链接服务器没有单独的字符集参数,字符串大多以 Unicode 或远程排序规则传递,真正要调的是 collation compatible 和 use remote collation 选项。
EXEC sp_serveroption @server = 'SQL_LS', @optname = 'collation compatible', @optvalue = 'true'; EXEC sp_serveroption @server = 'SQL_LS', @optname = 'use remote collation', @optvalue = 'true';
这两个选项适合 SQL Server 对 SQL Server 的场景,异构数据库比如 MySQL、Oracle,更应关注驱动连接串和环境变量。
链接MySQL字符集怎么设置:ODBC连接串里加charset
装驱动与建DSN
Windows 上先安装 MySQL ODBC 8.0 Unicode Driver,32 位和 64 位要跟 SQL Server 服务进程匹配,多数生产 SQL Server 是 64 位,驱动也要 64 位,可以在 ODBC 数据源管理员里建系统 DSN,也可以直接在 @provstr 里写完整连接串。
业内专家指出,跨字符集查询优先用 Unicode 驱动,不要用 ANSI 驱动,ANSI 驱动在中文路径、Emoji、生僻字场景下更容易出问题。
创建语句示例
如果使用 DSN,可以把字符集写在 DSN 配置里,也可以写在 @provstr 中:
EXEC sp_addlinkedserver
@server = 'MYSQL_LS',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@datasrc = 'MySQL_DSN',
@provstr = 'CHARSET=utf8mb4;';
如果不用 DSN,直接写完整 ODBC 连接串:
EXEC sp_addlinkedserver
@server = 'MYSQL_LS2',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@provstr = 'DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=10.0.0.8;PORT=3306;DATABASE=report;CHARSET=utf8mb4;';
登录凭据仍用 sp_addlinkedsrvlogin 单独维护,避免把密码散落在连接串里。
乱码排查清单
- 远程 MySQL 库、表、字段是不是
utf8mb4。 - ODBC 连接串有没有写
CHARSET=utf8mb4。 - 驱动是不是 Unicode 版本。
- SQL Server 本地排序规则是否支持目标字符。
- 四部分命名查询改 OPENQUERY 再测一次。
- 插入中文后,用
LEN和DATALENGTH检查是否被截断。
SQL Server链接Oracle中文乱码怎么解决:NLS_LANG与OPENQUERY
Oracle提供程序选择
Oracle 链接服务器常见提供程序是 OraOLEDB.Oracle,老旧的 MSDAORA 在新版本环境中逐步减少,创建语句大致如下:
EXEC sp_addlinkedserver
@server = 'ORA_LS',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORCL',
@provstr = 'Data Source=ORCL;';
Oracle 的字符集控制点不在 sp_addlinkedserver 里,而在 Oracle 客户端,常见做法是在运行 SQL Server 服务的账户下设置 NLS_LANG。
AMERICAN_AMERICA.AL32UTF8
设置路径有两类:系统环境变量,或 Oracle 客户端注册表项,改完后重启 SQL Server 服务,否则 SQL Server 进程读不到新变量。
查询用OPENQUERY
Oracle 查询建议用 OPENQUERY,把过滤条件下推到远程:
SELECT FROM OPENQUERY(ORA_LS, 'SELECT EMPNO, ENAME FROM SCOTT.EMP WHERE DEPTNO = 10');
这样远程 Oracle 先完成字符集转换,SQL Server 再接收结果,四部分命名也可以写,但跨库 JOIN 时更容易触发排序规则冲突。
排序规则冲突处理
遇到 Cannot resolve the collation conflict,可以在 JOIN 或 WHERE 里显式指定:
SELECT FROM OPENQUERY(ORA_LS, 'SELECT EMPNO, ENAME FROM SCOTT.EMP') o JOIN dbo.local_emp l ON o.EMPNO COLLATE DATABASE_DEFAULT = l.EMPNO COLLATE DATABASE_DEFAULT;
临时表场景同样适用,把关键字符列统一到 DATABASE_DEFAULT,多数情况下能先让查询跑通。
链接服务器和OPENQUERY哪个好:跨字符集查询对比
| 对比项 | 四部分命名 | OPENQUERY |
|---|---|---|
| 写法 | MYSQL_LS.report.user_profile |
OPENQUERY(MYSQL_LS,'SELECT ...') |
| 字符集转换 | 本地提供程序参与更多 | 远程端先转换 |
| 性能 | 可能拉全表 | 条件可下推 |
| JOIN本地表 | 方便 | 需子查询或临时表 |
| 参数化 | 支持 | 通常拼SQL |
| 乱码排查 | 较复杂 | 相对直观 |
行业共识认为,跨字符集、跨异构数据库的读取场景,OPENQUERY 更稳,要跟本地表做复杂 JOIN,可以先把 OPENQUERY 结果存入临时表,再统一排序规则。
生产环境实操:从创建到验证的完整路径
北京/上海企业常见场景
北京 S
QL Server链接服务器字符集配置 常出现在报表同步场景,比如总部 SQL Server 拉取 MySQL 订单库,字段里有中文用户名和 Emoji,上海某金融团队则常把 Oracle 历史数据挂到 SQL Server 做风控核对,两地团队遇到的问题相似:创建语句能跑通,但中文显示成问号,或者 JOIN 时排序规则报错。
处理顺序可以固定下来:
- 确认 SQL Server 服务账户和驱动位数。
- 在驱动连接串或客户端环境变量里指定字符集。
- 用 OPENQUERY 做最小查询验证。
- 用中文、生僻字、Emoji 各测一轮。
- 需要 JOIN 时,统一
COLLATE DATABASE_DEFAULT。 - 把密码从连接串迁移到
sp_addlinkedsrvlogin。
验证步骤
-- 看远程返回
SELECT FROM OPENQUERY(MYSQL_LS, 'SELECT ''中文测试'' AS c1');
-- 看本地排序规则
SELECT SERVERPROPERTY('Collation');
-- 看链接服务器选项
EXEC sp_helpserver 'MYSQL_LS';
OPENQUERY 正常,四部分命名乱码,问题多在提供程序或排序规则,OPENQUERY 也乱码,优先回到 ODBC 连接串、NLS_LANG、远程库字符集这三处。
SQL链接服务器创建语句与字符集指定Q&A
SQL Server链接服务器字符集怎么指定
SQL Server 链接服务器创建语句没有通用字符集参数,SQL Server 对 SQL Server 调排序规则选项;MySQL 在 ODBC 连接串写 CHARSET=utf8mb4;Oracle 设置 NLS_LANG;PostgreSQL 用 ODBC Unicode 连接,核心原则是让驱动、远程库、本地排序规则三者一致。
链接MySQL字符集怎么设置后还乱码怎么办
先确认驱动是 Unicode 版,再确认连接串里有 CHARSET=utf8mb4,接着检查远程表字段是不是 utf8mb4,然后用 OPENQUERY 直接查中文常量,若常量正常、表字段异常,问题在表或字段;若常量也异常,问题在驱动或连接串,最后检查 SQL Server 服务账户环境变量和本地排序规则。
SQL Server链接服务器字符集配置要额外花钱吗
SQL Server 本身不对链接服务器单独收费,费用主要看 SQL Server 许可证、Windows 服务器授权,以及云数据库实例规格,云上跨网络访问可能产生流量费,但字符集配置本身通常不另计费。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/688561.html





