2013-06-15 3 views
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 
+1

Я могу легко сохранить знак фунта в моих столбцах «varchar» (с настройкой 'Latin1_General_CI_AS') - не проблема. Мое предположение было бы более проблематичным, если ** импортировать ** этот внешний файл - с какой кодировкой должен начинаться этот файл? –

+0

Сортировка - порядок сортировки. Это не влияет на то, какую кодировку использует база данных. – JJJ

+0

@marc_s: плоский файл кодируется UTF-8. –

ответ

3

SQL Server, безусловно, магазин «£» правильно в varchar или nvarchar колонка используя сопоставление Latin1_General_CI_AS. Я вижу, что это происходит каждый день в программном обеспечении, которое я поддерживаю.

Я думаю, что проблема заключается в том, что текстовый файл закодирован и читается. «£» имеет значение кодовой точки 163 в Windows-1252 и Unicode. Однако в расширенной ASCII (например, код DOS на стр. 850) значение «£» имеет значение 156, а «ú» имеет значение 163. Является ли ваш код попыткой конвертировать текстовую кодировку csv перед передачей данных на SQL Server? Если csv кодируется как UTF-8, то преобразование из ASCII не требуется.

UPDATE

Глядя на MSDN, оказывается, что команда bulk insert выполняет преобразование наборов символов. OEM - это опция по умолчанию, если она не указана.

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

По умолчанию определенно не то, что вы хотите здесь. В идеале вы должны указать UTF-8 (CODEPAGE = '65001'). Однако MSDN говорит, что UTF-8 не поддерживается.

Я предлагаю вам изменить кодировку вашего CSV-файла на Windows-1252, а затем использовать параметр CODEPAGE = 'ACP' для импорта данных.

+0

Привет, Christian, я добавил дополнительную информацию и предоставил небольшой небольшой файл, чтобы проиллюстрировать мою проблему. Нет, я не делаю никаких дополнительных преобразований. –

+0

@ user1509107: Спасибо за дополнительную информацию, что было очень полезно. Я обновил свой ответ. –

+2

Большое спасибо, христианин, мне просто нужно было добавить CODEPAGE = 'ACP', и теперь все работает нормально. Я принял ваш ответ. Еще раз спасибо. –