我应该使用什么整理来在varchar中存储£(英镑符号)?

时间:2013-06-15 15:51:10

标签: sql sql-server-2008r2-express

我正在使用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

1 个答案:

答案 0 :(得分:3)

SQL Server肯定会使用排序规则varcharnvarcharLatin1_General_CI_AS列中正确存储“£”。我看到它每天都在我维护的软件中发生。

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

<强>更新

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

  

CODEPAGE = {'ACP'| 'OEM'| 'RAW'| 'code_page'}

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

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