将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向导的驱动问题,直接在数据库层面处理:
- 先在新UTF-8数据库里建好和源库结构一致的表(列排序规则默认继承新库的UTF-8设置,也可以显式指定
COLLATE Latin1_General_100_CI_AS_WS_SC_UTF8) - 用
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的无效字节(比如某些控制字符),先清理再迁移:
- 先找出表中的无效字符:
-- 检测tab1表col1列的无效字符 SELECT col1 FROM OldDB.dbo.tab1 WHERE col1 <> CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), col1))
- 根据业务需求清理这些字符,比如替换成空格或者删除对应行:
-- 替换空字符为空格 UPDATE OldDB.dbo.tab1 SET col1 = REPLACE(col1, CHAR(0x00), ' ') WHERE col1 LIKE '%' + CHAR(0x00) + '%'
清理完成后再用向导或T-SQL迁移即可。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

