Nhưng định nghĩa của varchar nói, nó cho phép dữ liệu chuỗi không unicode . Nhưng các ký hiệu Nhãn hiệu (™) và Đã đăng ký (®) là các ký tự Unicode . Liệu định nghĩa có mâu thuẫn với thuộc tính của kiểu dữ liệu varchar không?
Trong khi các câu trả lời khác không phải là không chính xác, tôi nghĩ nó sẽ giúp chỉ ra một sự nhầm lẫn trong thuật ngữ cơ sở. Tôi đã nhấn mạnh hai từ trong trích dẫn trên từ câu hỏi như một ví dụ về sự nhầm lẫn này. Khi tài liệu SQL Server nói về dữ liệu Unicode và phi Unicode , họ không nói về các ký tự . Họ đang nói về các chuỗi byte đại diện cho các ký tự nhất định. Sự khác biệt chính giữa các loại Unicode ( NCHAR
, NVARCHAR
, XML
, và bị phản đối / ác NTEXT
) và các loại phi Unicode ( CHAR
, VARCHAR
và bị phản đối / ác TEXT
) là những gì loại của chuỗi byte họ có thể lưu trữ.
Các loại không Unicode lưu trữ một trong nhiều mã hóa 8 bit, trong khi các loại Unicode lưu trữ một mã hóa Unicode 16 bit duy nhất: UTF-16 Little Endian. Như các câu trả lời khác đã đề cập, những ký tự nào có thể được lưu trữ trong mã hóa 8 bit / không Unicode tùy thuộc vào trang mã, được xác định bởi Collation. Mặc dù những người khác đã lưu ý rằng giá trị byte của "ký tự" có thể khác nhau giữa các trang mã được tìm thấy trên đó, giá trị byte thậm chí có thể thay đổi trong cùng một trang mã khi xử lý một trong một số trang mã EBCDIC (các biến thể của Windows- 1252), vốn chỉ được tìm thấy trong các Bộ sưu tập SQL Server cũ hơn, không nên sử dụng (nghĩa là những cái có tên bắt đầu bằng SQL_
).
Do đó, định nghĩa là chính xác: bất kỳ ký tự nào bạn có thể quản lý để lưu trữ trong loại không phải là Unicode luôn là 8 bit (ngay cả khi chúng sử dụng hai giá trị 8 bit kết hợp thành một "ký tự" duy nhất, đó là ký tự Double- Các trang mã bộ ký tự / DBCS cho phép). Và các kiểu dữ liệu Unicode luôn luôn là 16 bit, ngay cả khi đôi khi chúng sử dụng hai giá trị 16 bit kết hợp thành một "ký tự" duy nhất (nghĩa là một cặp thay thế đại diện cho một ký tự bổ sung).
VÀ, do SQL Server thực sự hỗ trợ mã hóa UTF-8 cho VARCHAR
và CHAR
kiểu dữ liệu kể từ SQL Server 2019,
VARCHAR
không còn có thể được gọi là "không Unicode". Vì vậy, bắt đầu với phiên bản beta công khai đầu tiên của SQL Server 2019 vào tháng 9 năm 2018, chúng ta nên gọi VARCHAR
là "kiểu dữ liệu 8 bit", ngay cả khi nói về các phiên bản trước SQL Server 2019. Thuật ngữ này đúng với cả 4 loại mã hóa có thể được sử dụng với VARCHAR
:
- ASCII mở rộng
- Bộ ký tự nhân đôi (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Chỉ có TEXT
kiểu dữ liệu (không được dùng trong SQL Server 2005, vì vậy không sử dụng nó) là "không phải là Unicode", nhưng đó chỉ là một kỹ thuật và gọi nó là "kiểu dữ liệu 8 bit" là chính xác.
NVARCHAR
, NCHAR
và NTEXT
có thể được gọi là "UTF-16" hoặc "kiểu dữ liệu 16 bit". Oracle, tôi tin rằng, sử dụng thuật ngữ "chỉ dành cho Unicode" NVARCHAR
, nhưng điều đó không loại trừ rõ ràng khả năng sử dụng UTF-8 (cũng là mã hóa Unicode), vì vậy có lẽ tốt nhất để sử dụng hai lựa chọn đầu tiên.
Để biết chi tiết về mã hóa UTF-8 mới, vui lòng xem bài viết của tôi:
Hỗ trợ UTF-8 bản địa trong SQL Server 2019: Tiên tri cứu rỗi hay sai?
PS Tôi đang dần dần tìm cách cập nhật tài liệu SQL Server để phản ánh những thay đổi này.
PPS Microsoft đã cập nhật một số trang với thông tin UTF-8, bao gồm tài liệu char và varchar được tham chiếu trong câu hỏi. Nó không còn chứa cụm từ "không Unicode". Nhưng đó chỉ là một FYI; nó không thay đổi câu hỏi vì đây là về mã hóa phi Unicode chứa các ký tự bị nhầm tưởng là chỉ Unicode.