2013-08-20 1 views
7

러시아어 텍스트로 작업하는 DB가 있는데, 쿼리를 실행하면 DB가 나에게 표시됩니다. 데이터베이스는 러시아인에 의해 사용되며 러시아어 텍스트를 올바르게 표시해야합니다!SQL Server 2012 Express는 러시아어 문자를 이해하지 못합니다.

enter image description here

모든 아이디어를 어떻게 해결 하는가? 앞으로는 러시아에 설치되어 러시아어 버전의 SQL Server와 작동하지만 현재는 영어 버전 SQL 2012 Express를 작업 중입니다.

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

열이'varchar' 또는'nvarchar'입니까? – Gabe

답변

16

당신에게 데이터가 올바르게 데이터베이스에 저장되어 있는지 위치 : 여기

테이블 및 삽입 문입니까? 어떻게 알았어?

열의 값이 nvarchar으로 지정되고 문자열 리터럴의 접두사 앞에 N이 지정되어 있는지 확인하십시오. 예를 들어, 이러한이 동일하지 : 예를 들어

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

:

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; 

결과 :

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

그리고 이것은 당신의 삽입 문에 어떻게 영향을 미치는지 보여, 당신의 문자열이 없습니다 N 접두사 :

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

결과 :

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

그래서, N'a prefix' 또는 손실 데이터와 유니 코드 문자열을 접두사.

+0

고맙습니다!작동하는 것처럼 보이므로 모든 필드에 텍스트를 삽입하기 전에 매번 'N'을 사용해야합니까? – Andrey

+1

유니 코드 인 열 (nchar/nvarchar)과 문자열 리터럴에 기본 ASCII 문자 집합 이외의 문자가 포함될 수있는 경우 삽입해야합니다. 그래서, 본질적으로 그렇습니다. –

2

아론 베르트랑 (Aaron Bertrand)이 왜 그런 결과를 얻는 지에 대한 좋은 설명을 주었지만, 러시아어로 모든 문자 앞에 'N'이라는 접두사를 붙이지 않는 방법이 있다고 말하고 싶습니다.
아는 한, 서버 정렬을 올바르게 설정했습니다.

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

결과 : 당신이 Cyrillic_General_CI_AS처럼, 예를 들어, 데이터 정렬을 설정한다면, 서버가 제대로 러시아어 문자로 VARCHAR를 처리 할 수 ​​보시다시피

espanol ????? иван Cyrillic_General_CI_AS 

, 스페인어, 일본어 문자열이 제대로 처리되지 않습니다 러시아 문자열은 있습니다. 그래서 문자열 앞에 접두사없이 데이터를 삽입 할 수 있습니다. 'N'

즉, 데이터베이스의 nvarchar 데이터 형식을 기본 문자열로 사용하고 저장 프로 시저의 nvarchar 매개 변수를 사용하고 있습니다. 필자는 코드에서 러시아어 문자열을 거의 사용하지 않고 (단지 뭔가를 테스트하고 싶을 때만) N'string' 문법을 사용하지 않았습니다.

정확한 기본 데이터 정렬이 유용 할 수 있지만이 솔루션에는 문제가 있습니다. change default collation on installed SQL Server은 쉽지 않으므로 SQL Server 인스턴스를 설치할 때 조심해야하며 데이터 정렬을 올바르게 선택해야합니다.

+0

이렇게하면이 경우 게으르 게 될 수 있지만 문제는 [서버 데이터 정렬 변경은 고통입니다] (http://technet.microsoft.com/en-us/library/ms179254.aspx) 다른 문제를 일으킴) 유니 코드 문자열 앞에 접두어를 붙이지 않는 습관은 다른 곳에서도 문제를 일으킬 수 있습니다. 서버 정렬을 변경하는 마법 같은 능력은 항상 있지는 않습니다. –

+0

@AaronBertrand 예, 서버 데이터 정렬 변경은 실제로 고통스런 일이지만,이 정보는 OP에 유용 할 수 있습니다. –

+0

귀하의 대답은 관계없이 N으로 접두어가 붙은 문자열에 N 접두사를 추가하는 것보다 서버 정렬 변경이 쉽다는 것을 의미하지는 않습니다. 서버 데이터 정렬 아니면 서버 정렬 (및 잡았다)을 변경하는 모든 단계를 포함 할 수도 있습니다. 지금은 더 쉬운 것처럼 들리지만 그렇지 않습니다. –