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:
- String yang masuk harus bertipe data
VARCHAR
, bukanNVARCHAR
(sebagaiNVARCHAR
selalu UTF-16 Little Endian, oleh karena itu kesalahan tentang tidak dapat mengganti penyandian). - XML memiliki deklarasi XML yang secara eksplisit menyatakan bahwa pengkodean XML memang UTF-8:
<?xml version="1.0" encoding="UTF-8" ?>
. - 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)
.