SQL Server 2012批量插入UTF-8带BOM的TXT文件时如何去除BOM字符?
解决SQL Server 2012加载UTF-8 txt文件时首行出现BOM字符的问题
这个问题我之前也碰到过,SQL Server 2012对带BOM的UTF-8文件确实有点小脾气😅,给你几个靠谱的解决办法:
方法一:指定UTF-8编码的代码页
SQL Server 2012开始支持通过CODEPAGE参数指定UTF-8编码(代码页65001),当你加上这个参数后,SQL Server会自动识别并跳过UTF-8的BOM,不会把它当成数据读取。修改后的脚本如下:
CREATE TABLE #Temp1(record nvarchar(512)) BULK INSERT #Temp1 FROM 'C:\Test\test.txt' WITH ( ROWTERMINATOR = '\n', CODEPAGE = '65001' -- 明确指定文件为UTF-8编码 ) SELECT * FROM #Temp1
方法二:加载后手动移除BOM字符
如果因为环境限制没法使用CODEPAGE参数,你可以在查询结果里手动去掉首行的BOM字符。UTF-8的BOM在nvarchar类型里会显示为N'∩╗┐',用STUFF函数就能轻松移除:
CREATE TABLE #Temp1(record nvarchar(512)) BULK INSERT #Temp1 FROM 'C:\Test\test.txt' WITH (ROWTERMINATOR = '\n') -- 处理首行的BOM字符 SELECT CASE WHEN record LIKE N'∩╗┐%' THEN STUFF(record, 1, 3, N'') ELSE record END AS cleaned_record FROM #Temp1
方法三:修改文件去掉BOM
如果是一次性处理的场景,你可以直接修改文件本身:用记事本打开test.txt,选择「另存为」,在编码选项里选择「UTF-8(无BOM)」,保存后再加载就不会有这个问题了。
补充说明
出现这个问题的原因是:SQL Server默认会按系统默认的代码页读取文件,而UTF-8的BOM是三个特殊字节(EF BB BF),被默认解析后就变成了你看到的乱码字符。指定CODEPAGE='65001'相当于告诉SQL Server「这是UTF-8编码的文件,按规则处理」,就能避免这个问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

