【问题标题】:BCP import with accented characters for SQL 2012用于 SQL 2012 的带重音字符的 BCP 导入
【发布时间】:2020-05-02 07:47:47
【问题描述】:

我已经为 bcp 创建了一个 .csv 文件,格式如下:

x,y,z(CR LF)
x,y,z(CR LF) etc...

我的 bcp in 命令工作如下:

bcp "{table}" in "{csv path}" -S {server} -t -T -q -w -f "{format xml file}"

使用以下格式命令和文件:

bcp "{table}" format nul -t, -T -q -S {server} -f {format file} -x

这可以正常上传,但不能正确上传重音字符。

我查看了SQL Docs,但这些示例并没有解决这个问题。

我的 .csv 是这种数据格式:

bigint, date, date, nvarchar, varchar, varchar, bigint, bigint

我是不是误会了,我应该更正格式文件、上传 IN 命令,还是两者都更正?

谢谢。

编辑: 基于MS docs 我现在已经开始手动创建如下格式文件 - 这总是会导致 Invalid field size for datatype 错误。

11.0
8
1       SQLCHAR         0       15      ","      1     fn1 Latin1_General_CI_AS
2       SQLDATE         1       3       ","      2     fn2 ""
3       SQLDATE         1       3       ","      3     fn3 ""
4       SQLNCHAR        2       510     ","      4     fn4 SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR         2       50      ","      5     fn5 Latin1_General_CI_AS
6       SQLCHAR         2       40      ","      6     fn6 Latin1_General_CI_AS
7       SQLBIGINT       1       8       ","      7     fn7 ""
8       SQLBIGINT       1       8       "\r\n"   8     fn8 ""

我还将表 nchar 字段的排序规则更改为“SQL_Latin1_General_CP1_CI_AS”

【问题讨论】:

  • 您需要-C 选项来告诉bcp 您的文件采用什么编码。它使用的“默认代码页”不一定是您想要的。 -C ACP 使用 Windows-1252,适用于很多情况; -C 65001 在最近的版本(2016+)中使用 UTF-8,并且是最“通用”的方法,当然,只要您也可以将 CSV 保存为 UTF-8。
  • @JeroenMostert UTF-8 CSV 需要 BOM 还是需要没有有 BOM 或者它不关心?
  • @AndrewMorton:这是一个很好的问题——我不知道答案,因为bcp 文档对此事保持沉默,我不记得上次发生了什么试过这个。
  • @jmejay 你能用编码为UTF-16LE 的数据尝试一下没有BOM 吗? (来自 Erland Sommarskog 在bcp unicode 中的回复。)
  • 我不认为格式文件对此有任何影响。数据库列的排序规则与输入文件编码不同——文件只有一种编码,因此不能为单个列切换它。也就是说,bcp 有更奇怪的疣,所以是的。确保您确实知道输入文件的编码是什么,首先——“重音字符出错”本身无法告诉您这一点。在记事本中,您可以使用“文件 -> 另存为”中的“编码”下拉菜单来指定。

标签: sql-server tsql command-line sql-server-2012 bcp


【解决方案1】:

终于解决了!

我将我的 bcp 输入 .csv 更改为 ANSI 格式,并使用代码页 1252 创建了我的 .fmt 文件。

我还确保我的 SQL 表字段已整理到 SQL_Latin1_General_CP1_CI_AS

所以,一旦 .csv 是 ANSI,我的格式代码就是:

bcp "table" format nul -q -T -S {server} -t, -r \n -f C:\LocalStuff\abc.fmt -c -C 1252 -x

使用 abc.fmt 上传后,它就可以工作了!

感谢所有帮助过的人。

【讨论】:

  • 这对你很有用,但值得注意的是,这必然导致无法导入不在 Windows-1252 中的字符(不能使用该排序规则存储在 VARCHAR 中, 但可以存储在NVARCHAR 中,您也有)。
  • @JeroenMostert 是的,谢谢。幸运的是,我的导入文件是常见的重音字符。我尝试了几个代码页,但我认为这是卡在 SQL 2012 中的不幸限制!
  • 这应该只是bcp 的限制,而不是 SQL Server 引擎本身(保存列本身缺乏 UTF-8 支持,但这很明显,没有必要解决这个问题问题)——bcp 的较新版本(以separate downloads on the doc page 提供)至少可以安装在其他机器上(我不知道它们在本地安装时是否会与现有的 SQL Server 安装配合得很好,所以最好不要尝试那)。当然,您的问题现在已经解决了,但仍然存在。
猜你喜欢
  • 2012-03-02
  • 2017-05-21
  • 1970-01-01
  • 2019-02-05
  • 2019-03-25
  • 1970-01-01
  • 2016-10-29
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多