Đâ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.
Nguồn
2016-03-10 11:20:26
đây là câu hỏi của tôi quá – Behzad
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 đó. –