2009-04-30 19 views
5

this'a göre, SQL Server 2K5, UCS-2'yi dahili olarak kullanır. UTF-16 verilerini UCS-2'de (uygun veri tipleri, nchar vb.) Saklayabilir, ancak ek bir karakter varsa, bu 2 UCS-2 karakteri olarak saklanır.SQL Server'da UTF-16/Unicode verilerini depolama

Bu, dize işlevleriyle ilgili sorunları ortaya çıkarır; yani, bir karakterin SQL Server tarafından 2 olarak ele alınmasıdır.

SQL Server'ın yalnızca UCS-2'yi işleyebildiği ve daha da fazlası için SQL 2K8'de çözülmediği konusunda biraz şaşırdım. Bu karakterlerin bazılarının hepsinin ortak olamayacağını takdir ediyorum.

Makalede önerilen işlevlerin yanı sıra, (kırık) dize işlevleri ve SQL Server 2K5'teki UTF-16 verileriyle ilgili en iyi yaklaşımla ilgili öneriler.

+0

benimsemeye mı? – gbn

+3

LEN, UTF-16 karakterlerinin sayısını değil, dizideki UCS-2 karakterlerinin sayısını döndürecektir. SUBSTRING, UTF-16 karakterlerini yarıya böler. Aynı, SOL ve SAĞ için de geçerli. ÜST ve ALT aynı zamanda muhtemelen kırılacaktır. REVERSE kesinlikle kırılacaktı. CHARINDEX ve PATINDEX de. FARK VE STUFF hakkında emin değilim. Yani bir sürü .... –

+2

Bunu işaretlediğiniz için teşekkürler. TÜM Unicode karakterlerini desteklememesi, bazı UTF-16 dize değerlerinin (ör. Windows veya .NET'ten) doğrulama olmadan SQL Server'a dökülmek için geçerli olmadığı anlamına gelir. Herhangi bir uygulamanın hatasız ve teknik olarak doğru olması için (RARE hataya neden olan karakterler, doğrulukta ne kadar fark yaratmazlar), TÜM dizeler, UCS-2 uyumlu karakterleri içerecek şekilde doğrulanmalıdır. SQL Server'da saklanmak. Olağanüstü! İşimi daha da zorlaştıracak Microsoft yolu. – Triynko

cevap

2

Dize işlevleri, unicode karakter dizeleriyle düzgün çalışır; Karakter sayısını önemseyenler iki baytlık karaktere iki karakter değil, tek bir karakter olarak davranır. İzlenecek tek şey, unicode kullanırken farklı değerler döndüren len() ve datalength(). Elbette doğru değerleri döndürürler - len() karakterleri uzunluk olarak döndürür ve datalength() uzunluğu bayt cinsinden döndürür. İki baytlı karakterler yüzünden farklı oluyorlar.

Kodunuzdaki uygun işlevleri kullandığınız sürece, her şey saydam şekilde çalışmalıdır.

DÜZENLEME: Sadece iki kez kontrol Books Online, unicode veri SQL Server beri dize fonksiyonları ile sorunsuz çalıştı 2000

DÜZENLEME 2: Açıklamalarda belirttiği gibi, SQL Server'ın dize işlevleri desteklemez Tam Unicode karakter seti, uçağın 0 dışında (veya başka bir deyişle, SQL Server'ın dize işlevleri yalnızca karakter başına en çok 2 bayt tanır) destek ayırmalarının desteklenmemesi nedeniyle ayarlanmıştır. SQL Server verileri doğru şekilde depolar ve döndürür. karakter sayımlarına dayanan dize işlevi beklenen değerleri döndürmez. Bunu atlamanın en yaygın yolu, SQL Server dışındaki dizgenin işlenmesi veya Unicode bilinçli dizgi işleme işlevlerini eklemek için CLR entegrasyonunun kullanılması gibi görünmektedir. Eğer kullanırsanız

bir "n" kahin alan (im 9i çalıştıran) ve .net OracleClient aracılığıyla erişim bunu, sadece parametreli gibi görünüyor:

+5

Soruyu yanlış anladınız. UTF-16 ek karakterler için izin verir. Bu, tek bir karakteri (kullanıcının bakış açısından) 2 kod birimi, yani 4 bayt olarak depolayarak çalışır. UCS-2 ek karakterleri işlemez. Bu nedenle, 4 bayt, bir karakter olduğunda aslında SQL Server tarafından iki karakter olarak ele alınır. –

+0

Sadece standart tanımlı diller dışındaki karakterler içindir. Teknik rapor, bunun öncelikle tarihsel diller için olduğunu belirtiyor. – Rick

+0

Açıklama: SQL Server UCS-2 unicode verileri üzerinde çalışıyor. UCS-2, onaylanmamış bir standarttır, Windows, Win2K'den beri UTF-16'yı dahili olarak kullanmıştır. –

-2

şey sadece zor yoldan öğrendim, eklemek sql çalışır ... N intring 'unicode öneki bazı satır içi sql varsa hile yapmak görünmüyor.

ve "work" ile, demek istediğim: temel karakter kümesi tarafından desteklenmeyen herhangi bir karakteri kaybedecektir. Yani, benim örneklerimde, ingilizce karakterleri iyi çalışır, kiril, soru işaretlerine/çöplere dönüşür. ORA_NCHAR_LITERAL_REPLACE değişken bağlantı dizesi falan ayarlanabilir eğer http://forums.oracle.com/forums/thread.jspa?threadID=376847

Wonder:

bu konuda daha dolu bir tartışmadır.

+0

Merhaba boomhauer, soru Microsoft SQL Server hakkındaydı. Cevabınız başka bir yerde yararlı olabilir. –

+0

Vay canına ... burada bir şey oldu. yanlış soruya gönderdim mi? Neredeyse bu kadar berbat eğer merak ediyorum, çünkü 2010 yılından beri etrafında oldu beri ... –

+0

aslında, bu cevap başka bir soru üzerinde kullanılan olduğunu biliyorum! –

5

SQL Server 2012 artık artık çiftleri de içeren UTF-16'yı destekliyor. http://msdn.microsoft.com/en-us/library/ms143726(v=sql.110).aspx, özellikle "Ek karakterler" bölümü.

Yani orijinal problem için bir düzeltme lütfen kırılır Ne dize fonksiyonları SQL Server 2012.

+0

SQL Server 2012, Tamamlayıcı Karakterlerin düzgün işlenmesini sağlayan _SC' derlemelerini tanıttığı doğru olsa da, Soru, SQL Server 2005 ile ilgili _very_ özeldir. Ayrıca, UTF-16'dan beri "UTF-16 + vekil çiftleri" değildir. = "UCS-2 + vekil çiftleri". –