2013-08-20 26 views
7

Tôi có DB đang làm việc với văn bản tiếng Nga tuy nhiên khi tôi chạy truy vấn nó cho tôi thấy điều này. Cơ sở dữ liệu sẽ được người Nga sử dụng và nó phải hiển thị văn bản tiếng Nga đúng cách!máy chủ sql 2012 express không hiểu chữ cái tiếng Nga

enter image description here

Mọi ý tưởng khắc phục sự cố? Trong tương lai nó sẽ nằm ở Nga và làm việc với phiên bản tiếng Nga SQL Server nhưng ngay bây giờ tôi đang làm việc trên phiên bản tiếng Anh SQL 2012 Express.

Dưới đây là bảng và chèn câu lệnh:

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

Cột của bạn là 'varchar' hoặc' nvarchar'? – Gabe

Trả lời

16

Bạn có chắc chắn dữ liệu đã được lưu trữ trong cơ sở dữ liệu một cách chính xác? Làm sao bạn biết?

Đảm bảo rằng cột có một đối chiếu thích hợp, cột được xác định là nvarchar và chèn các chuỗi ký tự có tiền tố là N. Ví dụ, đây không phải là giống nhau:

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

Như một ví dụ:

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; 

Kết quả:

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

Và để chứng tỏ điều này ảnh hưởng tuyên bố chèn của bạn, chuỗi của bạn là mất tích tiền tố N:

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

Kết quả:

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

Vì vậy, tiền tố chuỗi Unicode của bạn với N'a prefix' hoặc mất dữ liệu.

+0

Thanx!có vẻ như nó đang làm việc, vì vậy tôi có phải sử dụng 'N' mỗi lần trước khi chèn bất kỳ văn bản vào mỗi lĩnh vực? – Andrey

+1

Bạn cần nó cho bất kỳ chèn vào một cột đó là Unicode (nchar/nvarchar) và khi chuỗi chữ có thể chứa các ký tự bên ngoài bộ ký tự ASCII cơ bản. Vì vậy, về bản chất: có. –

2

Trong khi Aaron Bertrand đưa ra một giải thích tốt lý do tại sao bạn nhận được kết quả như vậy, tôi muốn nói có một cách không để tiền tố tất cả các bạn chuỗi với các chữ cái tiếng Nga với 'N'.
Theo như tôi biết, bạn vừa thiết lập đối chiếu máy chủ của mình đúng cách. Vì vậy, nếu bạn thiết lập chiếu của bạn, ví dụ, như Cyrillic_General_CI_AS, máy chủ có thể điều trị varchar với chữ Nga đúng:

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

kết quả:

espanol ????? иван Cyrillic_General_CI_AS 

Như bạn thấy, chuỗi Tây Ban Nha và Nhật Bản không được điều trị đúng cách trong khi các chuỗi tiếng Nga là. Vì vậy, bạn có thể chèn dữ liệu vào các cột nvarchar mà không cần thêm tiền tố với 'N'

Điều đó nói rằng, tôi đang sử dụng kiểu dữ liệu nvarchar trong cơ sở dữ liệu làm chuỗi mặc định, thông số nvarchar trong các thủ tục được lưu trữ. Tôi rất hiếm khi sử dụng các chuỗi tiếng Nga trong mã (chỉ khi tôi muốn thử nghiệm một cái gì đó), và tôi đã không bao giờ sử dụng cú pháp N'string'.

Mặc dù có phép đối chiếu mặc định chính xác, nhưng vấn đề với giải pháp này là không dễ để change default collation on installed SQL Server, vì vậy bạn phải cẩn thận khi cài đặt phiên bản SQL Server và chọn đối chiếu đúng cách.

+0

Trong khi điều này có thể cho phép bạn lười biếng trong trường hợp này, vấn đề là [thay đổi collation máy chủ là một nỗi đau] (http://technet.microsoft.com/en-us/library/ms179254.aspx) (và có thể gây ra các vấn đề khác), và thói quen không tiền tố chuỗi Unicode cũng có thể dẫn đến các vấn đề ở nơi khác - bạn không phải lúc nào cũng có khả năng ma thuật để thay đổi collation máy chủ. –

+0

@AaronBertrand yes, thay đổi server collation thực sự là một nỗi đau, nhưng thông tin này có thể hữu ích cho OP –

+0

Tôi nghĩ câu trả lời của bạn không nên ngụ ý rằng việc thay đổi collation server dễ dàng hơn việc thêm tiền tố N vào chuỗi. collation máy chủ. Hoặc có thể bao gồm tất cả các bước thay đổi collation máy chủ (và gotchas). Ngay bây giờ có vẻ như điều này dễ dàng hơn, và không phải vậy. –

Các vấn đề liên quan