如何在SQL批量插入中读取包含UTF-8代码页的CSV文件?

6za6bjd0  于 2023-01-28  发布在  其他
关注(0)|答案(4)|浏览(233)

我有一个波斯语CSV文件,我需要用SQL批量读取到SQL服务器:
我写了这么一大堆:

BULK INSERT TEMP
FROM 'D:\t1.csv'
WITH(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
CODEPAGE = '1256'
);

但不能读取UTF-8编码,不能将ی字符读取为?字符。
我怎么能这样写呢?

mzillmmw

mzillmmw1#

1.转到BULK INSERT documentation on MSDN
**2.**查找CODEPAGE上的部分
**3.**见注:

4c8rllxm

4c8rllxm2#

这个问题在SQL Server 2017中仍然存在,请参见herehere
如果您的导入只是一个偶然的练习,也就是说,如果不使用脚本导入是可以的,那么对我来说,有效的方法就是使用Tasks -〉Import -〉Flat file导入csv。
我在这里添加这个,因为这个页面是高,当你谷歌'SQL Server不支持代码页65001'。希望它能帮助一些。

8e2ybdfx

8e2ybdfx3#

除了其他人现在已经弃用或过时的早期答案之外,我想指出的是,在2022年5月的今天,发布版本为15.0.2080.9(SQL Server 2019),这对UTF-8完美地工作。

  • 创建UTF-8编码文件(我与BOM一起使用)

那么

BULK INSERT #tempTable1
FROM 'C:\....\file.csv' WITH (
CODEPAGE = '65001',
FIRSTROW = 2, --skip the first line
FIELDTERMINATOR = ';', 
ROWTERMINATOR = '\n')
GO

作品完美地为我,与许多法国和其他字符。

beq87vna

beq87vna4#

我浏览了链接到的文档@marc_s,找到了DATAFILETYPE = widechar的用法。
然后,我继续尝试我的UTF-8 csv文件,但它没有工作,给我的错误:
[...]数据文件没有Unicode签名
然后,我重新保存我的csv文件与Notepad's Unicode format,重试导入,瞧,成功。

  • 确保所有逗号和换行符都已转义(see here如何保存有效的csv)。

我的完整脚本(我使用的是SQL Server 2017):

BULK INSERT [my_table]
FROM 'C:\path\to\file.csv'
WITH
(
    FORMAT = 'CSV', 
    FIRSTROW = 2,           -- if you have a title row, the first data row is 2nd
    FIELDTERMINATOR = ',', 
    KEEPIDENTITY,           -- remove it if you don't want identity to be kept
    ROWTERMINATOR = '\n',   
    DATAFILETYPE = 'widechar', 
    ERRORFILE = 'C:\path\to\file_err.txt',
    KEEPNULLS,
    TABLOCK
)

注:

  • 确保日期字段采用有效的sql格式。
  • 关于KEEPNULSread this question(例如,如果文件中有NULL,请将其替换为空字符串)。

相关问题