2013-08-20 13 views
7

Mam DB, który pracuje z tekstem rosyjskim jednak gdy uruchamiam zapytań pokazuje mi to. Baza danych będzie używana przez Rosjan i musi poprawnie wyświetlać rosyjski tekst!SQL Server 2012 Express nie rozumieją rosyjskich liter

enter image description here

Jakieś pomysły jak to naprawić? W przyszłości znajdzie się w Rosji i będzie pracować z rosyjską wersją SQL Server, ale teraz pracuję nad angielską wersją SQL 2012 Express.

Oto tabela i wkładka stwierdzenie:

Create table Employee 
(
EmpID int not null IDENTITY (10, 1), 
StrName nvarchar (25) not null, 
Phone1 nvarchar (25) not null, 
Phone2 nvarchar (25) 
Primary Key (EmpID), 
); 
insert into Employee (LastName , FirstName,Phone1,Phone2) 
    values ('Иванов','111 111 11111','111 111 1111'); 
+0

Czy Twój kolumna 'varchar' lub' nvarchar'? – Gabe

Odpowiedz

16

Czy jesteś pewien, że dane zostały prawidłowo zapisane w bazie danych? Skąd wiesz?

Upewnij się, że kolumna ma właściwe uporządkowanie, że jest zdefiniowana jako nvarchar i że wstawki literałów łańcuchowych są poprzedzone prefiksem N. Na przykład, nie są takie same:

INSERT dbo.table(column) SELECT 'foo'; 
INSERT dbo.table(column) SELECT N'foo'; 

Jako przykład:

USE tempdb; 
GO 

CREATE TABLE dbo.foo 
(
    ID INT PRIMARY KEY, 
    bar NVARCHAR(32) COLLATE SQL_Ukrainian_CP1251_CI_AS 
); 

INSERT dbo.foo SELECT 1,'АБВГДЕЖЅZЗИІКЛ'; 
INSERT dbo.foo SELECT 2,N'АБВГДЕЖЅZЗИІКЛ'; 

SELECT ID, bar FROM dbo.foo; 
GO 
DROP TABLE dbo.foo; 

Wyniki:

ID bar 
---- -------------- 
1  ????????Z????? 
2  АБВГДЕЖЅZЗИІКЛ 

i pokazać, jak to wpływa na oświadczenie insert, ciąg brakuje prefiks N:

SELECT 
    CONVERT(NVARCHAR(32), 'Иванов'), 
    CONVERT(NVARCHAR(32), N'Иванов'); 

Wyniki:

------ ------ 
?????? Иванов 

więc poprzedzić struny Unicode z N'a prefix' lub utratę danych.

+0

Thanx!wygląda na to, że działa, więc czy muszę używać 'N' za każdym razem przed wstawieniem dowolnego tekstu do każdego pola? – Andrey

+1

Potrzebujesz go do dowolnej wstawki do kolumny, która jest Unicode (nchar/nvarchar) i gdy literał łańcuchowy może zawierać znaki spoza podstawowego zestawu znaków ASCII. W gruncie rzeczy: tak. –

2

Podczas gdy Aaron Bertrand dał dobre wyjaśnienie, dlaczego uzyskujesz takie wyniki, powiedziałbym, że istnieje sposób, aby nie prefiksować wszystkich twoich ciągów literami rosyjskimi z 'N'.
O ile mi wiadomo, właśnie ustawić sortowanie serwera prawidłowo. Więc jeśli ustawić sortowania, na przykład, jak Cyrillic_General_CI_AS, serwer może leczyć varchar z rosyjskich liter prawidłowo:

select 
    'español', '平成年月日', 'иван', 
    serverproperty('collation') 

wyniki:

espanol ????? иван Cyrillic_General_CI_AS 

Jak widać, hiszpański i japoński struny nie są właściwie leczone podczas gdy rosyjskie struny są. Więc możesz wstawiać dane do kolumn nvarchar bez prefiksowania ciągów z 'N'

Powiedziałem, że używam nvarchar typ danych w naszej bazie danych jako domyślne ciągi, nvarchar parametry w procedurach przechowywanych. Bardzo rzadko używam rosyjskich napisów w kodzie (tylko gdy chcę coś przetestować) i nigdy nie użyłem składni N'string'.

Chociaż prawidłowe sortowanie domyślne może być przydatne, problem z tym rozwiązaniem jest trudny - nie jest to łatwe z change default collation on installed SQL Server, więc podczas instalowania instancji serwera SQL należy zachować ostrożność i odpowiednio wybrać sortowanie.

+0

Podczas gdy to może pozwolić ci być leniwym w tym przypadku, problem polega na tym, że [zmiana sortowania serwera jest uciążliwa] (http://technet.microsoft.com/en-us/library/ms179254.aspx) (i może powodować inne problemy), a zwyczaj nieprzedstawiania ciągów Unicode może również prowadzić do problemów gdzie indziej - nie zawsze będziesz miał magiczną możliwość zmiany sortowania na serwerze. –

+0

@AaronBertrand tak, zmiana sortowania na serwerze jest rzeczywiście trudna, ale ta informacja może być przydatna dla OP –

+0

Myślę, że twoja odpowiedź nie powinna sugerować, że zmiana sortowania na serwerze jest łatwiejsza niż dodanie przedrostka N do ciągów, które powinny być poprzedzone przez N, niezależnie od zestawianie serwerów. Lub może zawierać wszystkie etapy zmiany sortowania na serwerze (i getchas). Teraz brzmi to tak, jak to jest łatwiejsze, i nie jest. –

Powiązane problemy