2016-03-10 20 views
5

Tôi đang sử dụng hàm ASCII để nhận mã ASCII tương đương với hai ký tự, nhưng tôi ngạc nhiên khi thấy không có sự khác biệt giữa 'ي' và ' ی ', bất cứ ai có thể giúp tôi?SQL Server không khác biệt giữa 'ی' và 'ي' trong đối chiếu Arabic_CI_AS

SELECT ASCII('ي'), ASCII('ی') 
+1

đây là câu hỏi của tôi quá – Behzad

+0

Cách bạn chọn btw , nhận giá trị ASCII của ký tự đầu tiên. Tất nhiên các ký tự đó không nằm trong [trang mã ASCII] (https://en.wikipedia.org/wiki/ASCII). Đó là một tiêu chuẩn Mỹ và có rất ít biểu tượng. Ký hiệu tiếng Ả Rập không phải là một phần của điều đó. –

Trả lời

5

Vì ký tự của bạn không phải là Unicode, bạn phải sử dụng hàm UNICODE() thay vì ASCII().

SELECT ASCII('ي'), ASCII('ی') 

sẽ cho kết quả: 237, 237

nhưng

SELECT UNICODE(N'ي'), UNICODE(N'ی') 

sẽ cho kết quả: 1610, 1740

+1

Cảm ơn bạn rất nhiều! –

+1

Điều này không hoạt động như - bạn nhận được "63" trả lại cho cả hai.Bạn cần đánh dấu các chuỗi ký tự chuỗi của bạn dưới dạng unicode với tiền tố 'N' - tôi sẽ chỉnh sửa nó cho bạn, cảm thấy tự do để khôi phục nếu bạn nghĩ rằng tôi sai. – Bridge

+0

@Bridge chỉnh sửa của bạn là đúng. Cảm ơn bạn – Behzad

2

Đây là giới hạn chức năng ASCII. Theo số documentation, ASCII:

Trả lại giá trị mã ASCII của ký tự ngoài cùng bên trái của biểu thức ký tự.

Tuy nhiên, các ký tự trong câu hỏi của bạn được tạo thành từ nhiều hơn một byte. Có vẻ như ASCII chỉ có thể đọc một byte.

Khi bạn sử dụng các ký tự này dưới dạng chuỗi ký tự không có tiền tố N, chúng được coi là ký tự một byte. Các truy vấn sau đây cho thấy rằng SQL Server không đối xử với những nhân vật như bình đẳng trong collation Arabic_CI_AS khi họ được đánh dấu đúng như đa byte:

SELECT CASE WHEN 'ي' COLLATE Arabic_CI_AS <> 'ی' COLLATE Arabic_CI_AS 
THEN 1 ELSE 0 END AS are_different_ascii, 
CASE WHEN N'ي' COLLATE Arabic_CI_AS <> N'ی' COLLATE Arabic_CI_AS 
THEN 1 ELSE 0 END AS are_different_unicode 

truy vấn sau đây cho thấy các byte tạo nên những nhân vật:

SELECT CAST(N'ي' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST(N'ی' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST('ي' COLLATE Arabic_CI_AS as varbinary(4)), 
CAST('ی' COLLATE Arabic_CI_AS as varbinary(4)) 

Tuy nhiên, ngay cả khi bạn đánh dấu các nhân vật như unicode, các ASCII hàm trả về giá trị như nhau bởi vì nó chỉ có thể đọc một byte:

SELECT ASCII(N'ي' COLLATE Arabic_CI_AS) , ASCII(N'ی' COLLATE Arabic_CI_AS) 

EDIT Là TT. chỉ ra, những ký tự này không có mục nhập trong bảng mã ASCII.

4

Hãy thử điều này

SELECT UNICODE(N'ي'), UNICODE(N'ی') 
3

Một giải pháp bằng cách sử dụng các đối chiếu thích hợp trong trường hợp bạn muốn sử dụng Ascii

Arabic_CS_AS_KS 

kết quả sẽ đến như ى = 236 và ي = 237

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