Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server - xác định cột kiểu XML với mã hóa UTF-8

Có cách nào để xác định một cột / trường SQL Server có mã hóa UTF-8 không?

Không, mã hóa Unicode duy nhất trong SQL Server là UTF-16 Little Endian, đây là cách NCHAR , NVARCHAR , NTEXT (Không dùng nữa kể từ SQL Server 2005, vì vậy không sử dụng điều này trong phát triển mới; ngoài ra, nó rất tệ so với NVARCHAR(MAX) dù sao) và XML các kiểu dữ liệu được xử lý. Bạn không có lựa chọn mã hóa Unicode như cho phép của một số RDBMS khác.

Bạn có thể chèn XML được mã hóa UTF-8 vào SQL Server, miễn là bạn tuân theo ba quy tắc sau:

  1. Chuỗi đến phải có kiểu dữ liệu VARCHAR , không phải NVARCHAR (dưới dạng NVARCHAR luôn là UTF-16 Little Endian, do đó lỗi không thể chuyển đổi mã hóa).
  2. XML có một khai báo XML tuyên bố rõ ràng rằng mã hoá của XML thực sự là UTF-8:<?xml version="1.0" encoding="UTF-8" ?> .
  3. Chuỗi byte cần phải là byte UTF-8 thực tế.

Ví dụ:chúng tôi có thể nhập tài liệu XML được mã hóa UTF-8 có chứa biểu tượng cảm xúc khuôn mặt đang la hét (và chúng tôi có thể lấy chuỗi byte UTF-8 cho Ký tự bổ sung đó bằng cách nhấp vào liên kết đó):

SET NOCOUNT ON;
DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?><root><test>'
                    + CHAR(0xF0) + CHAR(0x9F) + CHAR(0x98) + CHAR(0xB1)
                    + '</test></root>';

SELECT @XML;
PRINT CONVERT(NVARCHAR(MAX), @XML);

Trả về (trong cả tab "Kết quả" và "Tin nhắn"):

<root><test>😱</test></root>

Bạn đã đề cập trong một nhận xét về câu trả lời của @ Shnugo:

Tôi không gặp vấn đề gì khi chèn luồng được mã hóa utf-8 với tiêu đề utf-8 vào cột NVARCHAR của SQL Server 2013. Có một vấn đề ẩn?

Không, bạn đã không lưu trữ bất kỳ thứ gì được mã hóa UTF-8 trong NVARCHAR (ngoài ra, không có phiên bản 2013 của SQL Server, nhưng đó có thể chỉ là lỗi đánh máy). NVARCHAR chỉ là UTF-16 Little Endian. Nhiều khả năng luồng UTF-8 của bạn đã được trình điều khiển cơ sở dữ liệu chuyển đổi thành UTF-16 LE trong quá trình truyền vào SQL Server. Đây là mã hóa giống như một cột XML sẽ sử dụng, nhưng cột XML đã cố gắng chuyển đổi luồng từ UTF-8 thành UTF-16 nhưng không thành công do nó đã là UTF-16. Điều này cũng có nghĩa là khi thoát khỏi SQL Server, tài liệu XML được lưu trữ trong NVARCHAR cột sẽ vẫn có khai báo XML cho biết rằng mã hóa là UTF-8, nhưng nó chắc chắn không phải là UTF-8.

Nếu bạn thực sự cần dữ liệu phải là UTF-8 vì bạn không muốn chuyển đổi UTF-16 LE ra khỏi SQL Server XML hoặc NVARCHAR thành UTF-8, khi đó bạn không có lựa chọn nào khác ngoài việc lưu trữ dữ liệu dưới dạng VARBINARY(MAX) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả lại tất cả các cột không được tính toán từ một bảng trong SQL Server

  2. Thiết lập cơ sở dữ liệu SQL Server cục bộ

  3. Làm thế nào để xuất trường hình ảnh sang tệp?

  4. Cách tránh giám sát hoạt động làm ảnh hưởng đến hiệu suất máy chủ SQL của bạn

  5. SQL Server Resumable Index:Nó có tốt cho bạn không?