Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server - mendefinisikan kolom tipe XML dengan pengkodean UTF-8

Apakah ada cara untuk mendefinisikan kolom/bidang SQL Server memiliki penyandian UTF-8?

Tidak, satu-satunya penyandian Unicode di SQL Server adalah UTF-16 Little Endian, begitulah cara NCHAR , NVARCHAR , NTEXT (tidak digunakan lagi pada SQL Server 2005 jadi jangan gunakan ini dalam pengembangan baru; selain itu, ini menyebalkan dibandingkan dengan NVARCHAR(MAX) tetap), dan XML tipe data ditangani. Anda tidak mendapatkan pilihan penyandian Unicode seperti yang diizinkan RDBMS lainnya.

Anda dapat memasukkan XML yang disandikan UTF-8 ke dalam SQL Server, asalkan Anda mengikuti tiga aturan berikut:

  1. String yang masuk harus bertipe data VARCHAR , bukan NVARCHAR (sebagai NVARCHAR selalu UTF-16 Little Endian, oleh karena itu kesalahan tentang tidak dapat mengganti penyandian).
  2. XML memiliki deklarasi XML yang secara eksplisit menyatakan bahwa pengkodean XML memang UTF-8:<?xml version="1.0" encoding="UTF-8" ?> .
  3. Urutan byte harus berupa byte UTF-8 yang sebenarnya.

Misalnya, kita dapat mengimpor dokumen XML yang disandikan UTF-8 yang berisi emoji wajah berteriak (dan kita bisa mendapatkan urutan byte UTF-8 untuk Karakter Tambahan tersebut dengan mengikuti tautan itu):

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);

Pengembalian (di tab "Hasil" dan "Pesan"):

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

Anda menyebutkan dalam komentar pada jawaban @Shnugo:

Saya tidak punya masalah memasukkan aliran yang disandikan utf-8 dengan header utf-8 ke dalam kolom SQL Server 2013 NVARCHAR. Apakah akan ada masalah tersembunyi?

Tidak, Anda tidak menyimpan apa pun yang disandikan UTF-8 dalam NVARCHAR kolom (selain itu, tidak ada SQL Server versi 2013, tapi itu mungkin hanya salah ketik). NVARCHAR hanya UTF-16 Little Endian. Kemungkinan besar aliran UTF-8 Anda diubah menjadi UTF-16 LE oleh driver database selama transit ke SQL Server. Ini adalah pengkodean yang sama yang akan digunakan kolom XML, tetapi kolom XML akan mencoba mengubah aliran dari UTF-8 menjadi UTF-16 tetapi gagal karena sudah menjadi UTF-16. Ini juga berarti bahwa pada saat keluar dari SQL Server, dokumen XML disimpan di NVARCHAR kolom akan tetap memiliki deklarasi XML yang menyatakan bahwa penyandiannya adalah UTF-8, tetapi jelas bukan UTF-8.

Jika Anda benar-benar membutuhkan data menjadi UTF-8 saat keluar karena Anda tidak ingin mengonversi UTF-16 LE yang keluar dari SQL Server XML atau NVARCHAR ke UTF-8, maka Anda tidak punya pilihan selain menyimpan data sebagai 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. Lakukan Analisis Produk menggunakan Pencarian Teks Lengkap SQL Server. Bagian 1

  2. Karakter Escape di SQL Server

  3. Cara Menjatuhkan Kolom dengan Batasan di SQL Server

  4. Dapatkan Daftar Tabel dengan atau tanpa Batasan Kunci Utama di semua Basis Data dari Instance SQL Server - Tutorial SQL Server / TSQL Bagian 61

  5. SQL Group BY, Item N Teratas untuk setiap Grup