Ancak varchar'ın tanımı, unicode olmayan dize verilerine izin verdiğini söylüyor . Ancak Ticari Marka (™) ve Kayıtlı (®) sembolleri Unicode karakterlerdir . Tanım varchar veri tipinin özelliği ile çelişiyor mu?
Diğer cevaplar yanlış olmasa da, temel terminolojide bir karışıklığa dikkat çekmenin faydalı olacağını düşünüyorum. Bu karışıklığa örnek olarak yukarıdaki alıntıdaki iki kelimeyi sorudan vurguladım. SQL Server belgelerine Unicode ve Unicode olmayan bahseder zaman verilerine onlar vardır değil bahsediyoruz karakterler . Belirli karakterleri temsil eden bayt dizilerinden bahsediyorlar. Unicode türleri (arasındaki temel fark NCHAR
, NVARCHAR
, XML
ve kullanımdan kaldırıldı / kötü NTEXT
) ve Unicode olmayan türde ( CHAR
, VARCHAR
ve kullanımdan kaldırıldı / kötü TEXT
) ne tür bayt dizileri de depolayabilir.
Unicode olmayan türler birkaç 8 bit kodlamadan birini depolarken Unicode türleri tek bir 16 bit Unicode kodlaması depolar: UTF-16 Little Endian. Diğer cevapların belirttiği gibi, hangi karakterler 8 bitlik / Unicode olmayan bir kodlamada saklanabilir, Harmanlama tarafından belirlenen kod sayfasına bağlıdır. Diğerleri, bir "karakterin" bayt değerinin bulunduğu kod sayfalarında değişebileceğini belirtmiş olsa da, bayt değeri birkaç EBCDIC kod sayfasından biriyle uğraşırken aynı kod sayfası içinde bile değişebilir (Windows- 1252) yalnızca eski sürümlerde bulunan SQL Server Harmanlamalarını gerçekten kullanmamalı (yani,SQL_
).
Bu nedenle, tanım doğrudur: Unicode olmayan bir türde saklamak için yönetebileceğiniz karakterler her zaman 8 bittir (iki 8 bitlik değeri tek bir "karakter" olarak birlikte kullansalar bile, Bayt Karakter Kümesi / DBCS kod sayfaları izin verir). Ve Unicode veri türleri, bazen tek bir "karakter" olarak iki 16-bit değer kullansalar bile, her zaman 16 bittir (yani, bir Tamamlayıcı Karakteri temsil eden bir vekil çift).
AND, SQL Server'ın yerel olarak UTF-8 kodlamasını desteklemesi nedeniyle VARCHAR
veCHAR
SQL Server 2019'dan veri türlerini ,
VARCHAR
artık "Unicode olmayan" olarak adlandırılamaz. Bu nedenle, Eylül 2018'de SQL Server 2019'un ilk herkese açık beta sürümünden başlayarak, SQL Server 2019'dan VARCHAR
önceki sürümler açısından konuşurken bile "8 bit veri türü" olarak adlandırmalıyız. Bu terminoloji 4 tip için de geçerlidir. ile kullanılabilen kodlamaların listesi VARCHAR
:
- Genişletilmiş ASCII
- Çift Baytlı Karakter Kümeleri (DBCS)
- EBCDIC
- UTF-8 (Unicode)
Yalnızca TEXT
veri türü (SQL Server 2005'ten itibaren kullanımdan kaldırılmıştır, bu nedenle kullanmayın) "Unicode olmayan" dır, ancak bu sadece bir tekniktir ve buna "8 bit veri türü" olarak atıfta bulunmak doğrudur.
NVARCHAR
, NCHAR
ve NTEXT
"UTF-16" veya "16 bitlik veri türü" olarak adlandırılabilir. Oracle, inanıyorum ki, "yalnızca Unicode" terminolojisiniNVARCHAR
, ancak bu, işe yaramayacak UTF-8 (ayrıca bir Unicode kodlaması) kullanma olasılığını açıkça göz ardı etmiyor, bu nedenle muhtemelen en iyisi ilk iki seçenek.
Yeni UTF-8 kodlamaları hakkında ayrıntılar için lütfen yazıma bakın:
SQL Server 2019'da Yerel UTF-8 Desteği: Kurtarıcı mı yoksa Sahte Peygamber?
PS Yavaş yavaş bu değişiklikleri yansıtmak için SQL Server belgelerini güncelleyerek yolumu çalışıyorum.
PPS Microsoft, soruda belirtilen char ve varchar belgeleri dahil olmak üzere bazı sayfaları UTF-8 bilgisiyle güncellemiştir . Artık "Unicode olmayan" ifadesini içermiyor. Ama bu sadece bir FYI; bu, yanlışlıkla yalnızca Unicode olduğu düşünülen karakterleri içeren Unicode olmayan kodlamalar ile ilgili olduğu için soruyu değiştirmez.