Bởi vì MS SQL Server hỗ trợ UTF-8 kém so với các RDBMS khác.
MS SQL Server tuân theo quy ước, được sử dụng trong chính Windows, rằng các chuỗi "hẹp" ( char
trong C ++ CHAR
hoặc VARCHAR
trong SQL) được mã hóa trong một "trang mã" kế thừa. Vấn đề với các trang mã là chúng có số lượng ký tự hạn chế (hầu hết là mã hóa một byte, giới hạn báo cáo là 256 ký tự) và được thiết kế xung quanh một ngôn ngữ (hoặc nhóm ngôn ngữ có bảng chữ cái tương tự). Điều này làm cho nó khó khăn để lưu trữ dữ liệu đa ngôn ngữ. Ví dụ: bạn không thể lưu trữ cả dữ liệu tiếng Nga và tiếng Do Thái vì tiếng Nga sử dụng trang mã 1251 và tiếng Do Thái sử dụng trang mã 1255 .
Unicode giải quyết vấn đề này bằng cách sử dụng một bộ ký tự mã hóa khổng lồ duy nhất có chỗ cho hơn một triệu ký tự, đủ để đại diện cho mọi ngôn ngữ trên thế giới. Có một số sơ đồ mã hóa Unicode; Microsoft thích sử dụng UTF-16 , vì những lý do lịch sử . Vì UTF-16 biểu thị các chuỗi dưới dạng một chuỗi các đơn vị mã 16 bit thay vì 8 bit truyền thống, nên cần một loại ký tự riêng. Trong MSVC ++, đây là wchar_t
. Và trong MS SQL, nó NCHAR
hay NVARCHAR
. Chữ N
viết tắt của "quốc gia" , có vẻ ngược với tôi vì Unicode là về quốc tế hóa , nhưng đó là thuật ngữ ISO.
Các triển khai SQL khác cho phép bạn lưu trữ văn bản UTF-8 trong một VARCHAR
cột. UTF-8 là mã hóa có độ dài thay đổi (1-4 byte cho mỗi ký tự) được tối ưu hóa cho trường hợp khi dữ liệu của bạn chủ yếu nằm trong phạm vi Latin cơ bản (được biểu thị dưới cùng 1 byte cho mỗi ký tự như ASCII), nhưng có thể biểu thị bất kỳ ký tự Unicode nào. Do đó, bạn sẽ tránh được vấn đề "gấp đôi không gian" được đề cập bởi bwalk2895.
Thật không may, MS SQL Server không hỗ trợ UTF-8VARCHAR
, vì vậy thay vào đó bạn phải sử dụng UTF-16 thay vào đó (và lãng phí không gian cho văn bản ASCII), sử dụng trang mã không Unicode (và mất khả năng thể hiện các ký tự nước ngoài), hoặc lưu trữ UTF-8 trong một BINARY
cột (và xử lý các sự bất tiện như các hàm chuỗi SQL không hoạt động đúng hoặc phải xem dữ liệu dưới dạng kết xuất hex trong trình quản lý GUI DB của bạn).