问题
linux 版本的sqlserver 的bulk insert不支持codepage参数,直接导入gbk编码文件会报错
BULK with Codepage Parameter on Linux #289
解决方案1:通过将文件转换为utf16来解决
这里有人给出的解决方案是将文件改为utf16,然后设置参数DATAFILETYPE = 'widechar'
linux转换编码
iconv -f GBK -t UTF-16 202101.csv -o 202101.csv.utf16
可以导入,但问题是用iconv转换后导入时有报错,部分行出现了乱码,NFU7b,hQ nS⚌,vQ⚌N,⚌m9⚌
可能是iconv转换的问题,但找不到解决方案
解决方案2:通过sqlserver2019,新增的codepage='RAW'来导入
继续看上面的文章,发现sqlserver 2019增加了codepage参数但只支持一个选项raw
raw的意思是,不进行编码转换直接导入。
理论上如果数据库字符集和文件字符集一致,理论上是可以直接导入的。
测试的结果和预期一致,可以正常导入。
目前测试环境:
数据库排序规则Chinese_PRC_CI_AS
文本列类型varchar
导入的数据文件字符集gbk
导入命令
BULK
INSERT test.dbo.test
FROM '/home/mssql/202101.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' ,
codepage='RAW',
FIRSTROW =2
导入正常,select中文正常。
完美解决!
© 2021, 新之助meow. 原创文章转载请注明: 转载自http://www.xinmeow.com