2010-11-10 69 views
5

Tôi đang sử dụng Sql Server 2008 R2 Enterprise. Tôi đang viết mã một ứng dụng có khả năng chèn, cập nhật, xóa và chọn các bản ghi từ một bảng Sql. Ứng dụng đang tạo ra lỗi khi nói đến các bản ghi chứa các ký tự đặc biệt chẳng hạn như ć, č š, đ và ž.Ký tự Unicode trong bảng Sql

Đây là những gì sẽ xảy ra:

Lệnh:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1' 

chèn một kỷ lục mới nhưng trường Name là Boris Borenovic, vì vậy nhân vật ć được thay đổi để c.

Lệnh:

SELECT * FROM Account 
WHERE Name = 'Boris Borenović' 

trả về bản ghi đúng, vì vậy một lần nữa nhân vật ć được thay thế bằng c và kỷ lục được trả về.

Câu hỏi:

  1. Có thể làm cho Sql Server lưu ký tự đặc biệt ć và khác đề cập trước đó?
  2. Vẫn có thể, nếu câu hỏi trước được giải quyết, để Sql có thể trả về bản ghi Boris Borenović ngay cả khi truy vấn yêu cầu Boris Borenovic?

Vì vậy, khi lưu hồ sơ Tôi muốn Sql để lưu chính xác những gì được đưa ra, nhưng khi lấy các hồ sơ, tôi muốn nó để có thể ingnore các ký tự đặc biệt. Cảm ơn vì sự giúp đỡ.

Trả lời

12

1) Hãy chắc chắn rằng cột là kiểu nvarchar hơn là varchar (hoặc nchar cho char)

2) Sử dụng N' vào lúc bắt đầu của xâu chứa các chuỗi như vậy, ví dụ N'Boris Borenović'

3) Nếu bạn đang sử dụng một thư viện khách hàng (ví dụ ADO.Net), cần xử lý văn bản Unicode, chừng nào, một lần nữa, các thông số được đánh dấu như là nvarchar/NCHAR thay vì varchar/char

4) Nếu bạn muốn truy vấn và bỏ qua dấu, thì bạn có thể thêm mệnh đề COLLATE vào lựa chọn của mình. Ví dụ:

SELECT * FROM Account 
WHERE Name = 'Boris Borenovic' COLLATE Latin1_General_CI_AI 

Trường hợp _CI_AI có nghĩa là phân biệt chữ hoa chữ thường, không nhạy cảm, nên trả về tất cả các hàng với tất cả các biến thể của "c" ở cuối.

5) Nếu cột trong bảng là một phần của ràng buộc UNIQUE/PK, và bạn cần nó chứa cả "Boris Borenović" và "Boris Borenovic", sau đó thêm mệnh đề COLLATE vào định nghĩa cột, nhưng thời gian sử dụng một collation với "_AS" ở cuối, mà nói rằng đó là giọng nhạy cảm.

+0

Cảm ơn câu trả lời của bạn. Tên trường trong bảng Sql của tôi là kiểu nvarchar (50), do đó, vấn đề vẫn giữ nguyên. Đối với các đối chiếu, tôi nghĩ rằng nên giải quyết câu hỏi thứ hai, tuy nhiên, cho đến khi tôi giải quyết 'ć' và các ký tự còn thiếu, tôi bị mắc kẹt. Tôi đã kiểm tra văn bản lệnh Sql của tôi trong mã và nó xuất hiện bình thường (có nghĩa là nó chứa các ký tự pesky). Có thể có bất cứ điều gì khác mà ngăn cản việc tiết kiệm của những nhân vật? Sao câu lệnh SELECT cũng chuyển 'ć' thành' c' (tôi không sử dụng COLLATE)? – Boris

+0

@Boris - như tôi đã nói (điểm 2), nếu bạn có chuỗi ký tự (như trong ví dụ bạn đã đăng), bạn cần đặt dấu "N" trước dấu mở ngoặc, nếu không chuỗi sẽ được chuyển đổi vào một hình thức khác trước khi nó được vào bảng. –

+0

OK, tôi hiểu rồi! Tôi có nên đặt 'N' ở trước mỗi giá trị trường không? – Boris

1

Để cho phép SQL Server lưu trữ các ký tự đặc biệt, hãy sử dụng nvarchar thay vì varchar cho loại cột.

Khi nhặt đồ, bạn có thể buộc một collation giọng-insensitve để nó bỏ qua sự khác nhau C:

WHERE Name = 'Boris Borenović' COLLATE Cyrillic_General_CI_AI 

Ở đây, CI là viết tắt của trường hợp không nhạy cảm, và AS cho Accent Insensitive.

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