You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将SQL Server Latin1排序规则数据库迁移至UTF-8遇导出错误求助

解决SQL Server Latin1到UTF-8数据库迁移的"Invalid data for UTF8-encoded characters"错误

方案1:更换支持UTF-8的驱动

  • 弃用SQL Native Client 11.0,改用Microsoft OLE DB Driver for SQL Server(18版本)或ODBC Driver 17/18 for SQL Server——这两个驱动原生支持SQL Server 2019+的UTF-8排序规则,不会出现字符编码转换错误。
  • 在SSMS 20.2的导入导出向导里,选择数据源/目标时,直接选对应的新驱动:
    • OLE DB类型选「Microsoft OLE DB Driver 18 for SQL Server」
    • ODBC类型选「ODBC Driver 18 for SQL Server」
  • 要是SSMS里没找到这些驱动,单独安装对应版本的驱动包即可。

方案2:用T-SQL直接批量迁移

绕开SSIS向导的驱动问题,直接在数据库层面处理:

  1. 先在新UTF-8数据库里建好和源库结构一致的表(列排序规则默认继承新库的UTF-8设置,也可以显式指定COLLATE Latin1_General_100_CI_AS_WS_SC_UTF8)
  2. 用INSERT INTO...SELECT语句直接迁移:
-- 示例迁移tab1表
INSERT INTO NewDB.dbo.tab1
SELECT * FROM OldDB.dbo.tab1
  • 要是遇到个别字符转换失败,用TRY_CONVERT兜底处理无效字符:
INSERT INTO NewDB.dbo.tab1 (col1, col2)
SELECT 
    TRY_CONVERT(VARCHAR(255), col1 COLLATE Latin1_General_100_CI_AS_WS_SC_UTF8),
    TRY_CONVERT(VARCHAR(500), col2 COLLATE Latin1_General_100_CI_AS_WS_SC_UTF8)
FROM OldDB.dbo.tab1

这种方式直接在SQL Server内部完成字符转换,完全避开客户端驱动的兼容性坑。

方案3:清理源库中的无效字符

错误根源可能是源库CHAR/VARCHAR列里藏着Latin1编码无法映射到UTF-8的无效字节(比如某些控制字符),先清理再迁移:

  1. 先找出表中的无效字符:
-- 检测tab1表col1列的无效字符
SELECT col1
FROM OldDB.dbo.tab1
WHERE col1 <> CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), col1))
  1. 根据业务需求清理这些字符,比如替换成空格或者删除对应行:
-- 替换空字符为空格
UPDATE OldDB.dbo.tab1
SET col1 = REPLACE(col1, CHAR(0x00), ' ')
WHERE col1 LIKE '%' + CHAR(0x00) + '%'

清理完成后再用向导或T-SQL迁移即可。

内容的提问来源于stack exchange,提问作者Seb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:37:37