Tetapi definisi varchar mengatakan, ini memungkinkan data string non-unicode . Tetapi simbol-simbol Merek Dagang (™) dan Terdaftar (®) adalah karakter Unicode . Apakah definisi tersebut bertentangan dengan properti dari tipe data varchar?
Sementara jawaban lain tidak salah, saya pikir akan membantu untuk menunjukkan kebingungan dalam terminologi dasar. Saya telah menekankan dua kata dalam kutipan di atas dari pertanyaan sebagai contoh dari kebingungan ini. Ketika dokumentasi SQL Server berbicara tentang Unicode dan non-Unicode Data , mereka tidak berbicara tentang karakter . Mereka berbicara tentang urutan byte yang mewakili karakter tertentu. Perbedaan utama antara jenis Unicode ( NCHAR
, NVARCHAR
, XML
, dan usang / jahat NTEXT
) dan jenis non-Unicode ( CHAR
, VARCHAR
, dan usang / jahat TEXT
) adalah apa jenis urutan byte mereka dapat menyimpan.
Jenis non-Unicode menyimpan salah satu dari beberapa pengkodean 8-bit, sedangkan jenis Unicode menyimpan pengodean Unicode 16-bit tunggal: UTF-16 Little Endian. Seperti jawaban lain yang disebutkan, karakter mana yang dapat disimpan dalam pengkodean 8-bit / non-Unicode tergantung pada halaman kode, yang ditentukan oleh Collation. Sementara yang lain telah mencatat bahwa nilai byte dari "karakter" dapat bervariasi di seluruh halaman kode yang ditemukan, nilai byte bahkan dapat bervariasi dalam halaman kode yang sama ketika berhadapan dengan salah satu dari beberapa halaman kode EBCDIC (variasi Windows- 1252), yang hanya ditemukan di SQL Server Collations yang lebih lama, yang seharusnya tidak benar-benar digunakan (yaitu yang memiliki nama yang dimulai dengan SQL_
).
Oleh karena itu, definisi tersebut akurat: karakter apa pun yang dapat Anda kelola untuk disimpan dalam tipe non-Unicode selalu 8-bit (bahkan jika mereka menggunakan dua nilai 8-bit dalam kombinasi sebagai "karakter" tunggal, yang merupakan apa yang Double- Halaman Byte Character Set / DBCS memungkinkan untuk). Dan tipe data Unicode selalu 16-bit, bahkan jika mereka kadang-kadang menggunakan dua nilai 16-bit dalam kombinasi sebagai "karakter" tunggal (yaitu pasangan pengganti yang pada gilirannya mewakili Karakter Tambahan).
DAN, karena SQL Server secara native mendukung pengkodean UTF-8 untuk VARCHAR
dan CHAR
tipe data pada SQL Server 2019,
VARCHAR
tidak dapat lagi disebut sebagai "non-Unicode". Jadi, dimulai dengan beta publik pertama dari SQL Server 2019 pada September 2018, kita harus merujuk VARCHAR
sebagai "datatype 8-bit", bahkan ketika berbicara dalam hal versi sebelum SQL Server 2019. Terminologi ini berlaku untuk semua 4 jenis pengkodean yang dapat digunakan dengan VARCHAR
:
- Extended ASCII
- Set Karakter Double-Byte (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Hanya TEXT
tipe data (tidak digunakan pada SQL Server 2005, jadi jangan gunakan) adalah "non-Unicode", tapi itu hanya teknis, dan menyebutnya sebagai "8-bit datatype" yang akurat.
NVARCHAR
,, NCHAR
dan NTEXT
dapat disebut sebagai "UTF-16" atau "tipe data 16-bit". Oracle, saya percaya, menggunakan terminologi "Unicode-only" untuk NVARCHAR
, tetapi itu tidak dengan jelas mengesampingkan kemungkinan menggunakan UTF-8 (juga enkode Unicode), yang tidak akan berfungsi, jadi mungkin yang terbaik untuk tetap menggunakan dua opsi pertama.
Untuk detail tentang pengkodean UTF-8 baru, silakan lihat posting saya:
Dukungan UTF-8 Asli di SQL Server 2019: Juruselamat atau Nabi Palsu?
PS Saya perlahan-lahan bekerja dengan cara saya memperbarui dokumentasi SQL Server untuk mencerminkan perubahan ini.
PPS Microsoft telah memperbarui beberapa halaman dengan info UTF-8, termasuk dokumentasi char dan varchar yang dirujuk dalam pertanyaan. Itu tidak lagi mengandung frasa "non-Unicode". Tapi itu hanya FYI; itu tidak mengubah pertanyaan karena ini adalah tentang pengkodean non-Unicode yang mengandung karakter yang keliru dianggap hanya Unicode.