4

我正在使用 SQL Server Express 2008 R2。

我正在从 csv 文件导入,并且某些列具有“£”符号作为某些自由文本的一部分。当此文件加载到数据库中时,“£”符号显示为“ú”。我认为这肯定与数据库排序规则有关。当前的数据库排序规则是 Latin1_General_CI_AS。

什么排序规则将“£”存储为 SQL Server 中的“£”。

非常感谢。

更多信息:我在这里创建了一个小文件来演示我的问题:https ://www.dropbox.com/s/yvcx4t9nk9p0bf7/poundTest.txt

use myDB;
go

create table test
(id int,
amt_range varchar(50));

bulk insert test
from 'F:\poundtest.txt'
with (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
firstrow=1
);
select * from test;

这将返回:

id  amt_range
1   <-ú200K
2   -ú200K to -ú20k
3   -ú20k to ú0k
4   ú0k to ú20k
5   ú20k to ú200k
6   >ú200k
4

1 回答 1

3

SQL Server 肯定会使用 collat​​ion 将“£”正确存储在varcharornvarchar列中Latin1_General_CI_AS。我每天都在我维护的软件中看到它发生。

我认为问题在于文本文件的编码和读入方式。“£”在 Windows-1252 和 Unicode 中的代码点值都是 163。但是,在扩展 ASCII(例如 DOS 代码页 850)中,“£”的值为 156,而“ú”的值为 163。您的代码是否尝试在将数据传递给 SQL Server 之前转换 csv 文本编码?如果 csv 编码为 UTF-8,则无需从 ASCII 转换。

更新

查看 MSDN,该bulk insert命令似乎执行字符集转换。如果未指定,OEM 是默认选项。

代码页 = { 'ACP' | 'OEM' | '原始' | 'code_page' }

默认值绝对不是你想要的。理想情况下,您应该指定 UTF-8 ( CODEPAGE = '65001')。但是,MSDN 说不支持 UTF-8。

我建议您将 CSV 文件的编码更改为 Windows-1252,然后使用该CODEPAGE = 'ACP'选项导入数据。

于 2013-06-15T16:11:43.910 回答