İstemci bilgisayarın kod sayfası veritabanının kod sayfasından farklı olduğunda karakter verileri yanlış temsil edilir
Özgün ürün sürümü: SQL Server
Özgün KB numarası: 904803
Belirtiler
Aşağıdaki senaryoyu inceleyin:
Unicode olmayan bir veri türü kullanan bir SQL Server veritabanından karakter verilerini sorgulamak için SQL Server Management Studio kullanırsınız. Örneğin, SQL Server veritabanı ,
varchar
veyatext
veri türünü kullanırchar
.İstemci bilgisayarın kod sayfası, veritabanının kod sayfasından farklıdır. Kod sayfası, veritabanının harmanlaması ile ilişkilendirilir.
Bu senaryoda, karakter verileri yanlış temsil edilir.
Örneğin, aşağıdaki sorunlardan biriyle karşılaşabilirsiniz:
Karakter verileri soru işareti (
?
) olarak gösterilir. Karakter verilerini sorgulamadan önce karakter verilerini Unicode olmayan bir veri türü olarak ekler veya güncelleştirirseniz bu sorunu görebilirsiniz. Bu sorun, farklı bir kod sayfası olan bir istemci bilgisayarda SQL Server Management Studio kullanarak bu değişikliği yaparsanız oluşur.Karakter verileri bozuk veriler olarak temsil edilir. X kod sayfasının karakter verileri, Y kod sayfasının Unicode olmayan bir sütununda depolanır. Ayrıca, karakter verileri çevrilmiyor. Bu sorun, karakter verilerini SQL Server Management Studio kullanarak sorguladığınızda oluşur.
Not
karakter verilerini SQL Server Management Studio kullanarak sorguladığınızda, karakter verileri için çeviri yap ayarı (parametre olarak
Auto Translate
da bilinir) devre dışı bırakılırsa karakter verileri doğru şekilde temsil edilir.Auto Translate
parametresi, SQL Server ve OLE DB için Microsoft .NET Framework Veri Sağlayıcısı için Microsoft OLE DB Sağlayıcısı özelliğinin parametresidirConnectionString
.
Neden
Bu sorun, X kod sayfasının karakter verileri desteklenmeyen Y kod sayfasının Unicode olmayan bir sütununda depolandığından oluşur.
SQL Server'da Unicode olmayan bir veri türünün dize değişmez değeri kullandığınızda, veritabanının harmanlamasından türetilen varsayılan kod sayfası kullanılarak dize değişmez değeri dönüştürülür. X kod sayfasının karakter verilerini Y kod sayfasının bir sütununda depolamak veri kaybına veya veri bozulmasına neden olabilir.
Karakter verileri bozuk veri olarak gösteriliyorsa, veriler yalnızca SQL Server için Microsoft OLE DB Sağlayıcısı veya OLE DB için Microsoft .NET Framework Veri Sağlayıcısı parametresini devre dışı bırakırsanız Auto Translate
doğru şekilde gösterilebilir.
Not
SQL Server Management Studio, SQL Server veritabanına bağlanmak için SQL Server için Microsoft .NET Framework Veri Sağlayıcısı'nı kullanır. Bu veri sağlayıcısı parametresini Auto Translate
desteklemiyor.
Geçici Çözüm
Bu sorunu geçici olarak çözmek için aşağıdaki yöntemlerden birini kullanın:
Yöntem 1: Unicode olmayan veri türü yerine Unicode veri türü kullanma
Kod sayfası çevirisinin neden olduğu tüm sorunları önlemek için sütunları Unicode veri türüne değiştirin. Örneğin, , nvarchar
veya ntext
veri türünü kullanınnchar
.
Yöntem 2: Veritabanı için uygun harmanlama kullanın
Unicode olmayan bir veri türü kullanmanız gerekiyorsa, her zaman veritabanının kod sayfasının ve Unicode olmayan sütunların kod sayfasının Unicode olmayan verileri doğru depolayaadığından emin olun. Örneğin, kod sayfası 949 (Korece) karakter verilerini depolamak istiyorsanız, veritabanı için Korece harmanlama kullanın. Örneğin, veritabanı için harmanlamayı kullanın Korean_Wansung_CI_AS
.
Yöntem 3: "ikili" veya "varbinary" veri türünü kullanın
Veritabanının, uygun kod sayfası çevirisini gerçekleştirmeye çalışmadan işlenen karakterlerin tam bayt değerlerini doğrudan depolamasını ve almasını istiyorsanız, veya varbinary
veri türünü kullanınbinary
.
Yöntem 4: Verileri depolamak ve almak ve "Otomatik Çeviri" parametresini devre dışı bırakmak için farklı bir araç kullanın
Uyarı
X kod sayfasının karakter verilerinin Y kod sayfası sütununda depolanmasını test etme veya desteklemeyiz. Bu işlem dilsel olarak yanlış sorgu sonuçlarına, yanlış dize eşleştirme veya sıralamaya ve beklenmeyen kod sayfası çevirisine (veri bozulması) neden olabilir. Bu sorunu çözmek için diğer yöntemlerden birini kullanmanızı öneririz.
Farklı bir kod sayfası olan bir veritabanına bağlanmak üzere SQL Server için Microsoft OLE DB Sağlayıcısı'nı kullandığınızda ve Unicode olmayan bir veri türü sütunundaki karakter verilerini sorgulamaya çalıştığınızda, çevrilmemiş karakterleri veritabanında depoladığınızdan emin olun.
Not
Aşağıdaki örnekte, istemci bilgisayarın kod sayfasının Korece (CP949) olduğu ve SQL Server veritabanının kod sayfasının İngilizce (CP1252) olduğu varsayılır. Kod örneklerindeki yer tutucuları sizin durumunuz için uygun değerlerle değiştirmeniz gerekir.
Bu soruna geçici bir çözüm bulmak için şu adımları uygulayın:
Karakterleri el ile ham verilere dönüştürün ve ardından veritabanının kod sayfasını kullanarak verileri veritabanına ekleyin. Bu işlemi yapmak için aşağıdakine benzer bir kod parçacığı kullanın:
string strsrc="가";string strsrc="가"; string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc)); sql="insert into <tablename> (<column>,) values ('" + strtag + "')"; // code for updating the database;
Verileri sorgulamak istediğinizde, veritabanına bağlanmak için SQL Server için Microsoft OLE DB Sağlayıcısı'nı veya SQL Server için Microsoft .NET Framework Veri Sağlayıcısı'nı
Auto Translate
kullanın ve ardından parametresini olarakFalse
ayarlayın. Bu işlemi yapmak için aşağıdakine benzer bir kod parçacığı kullanın:OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" + " Initial Catalog =<yourdatabase>;"+ "User id=<youruserid>; Password=<yourpassword>;"+ "Auto Translate=False"); // code for representing the character data;
Daha fazla bilgi
Sorunu yeniden oluşturmak için şu adımları izleyin:
Varsayılan kod sayfası olarak Korece (CP949) bulunan istemci bilgisayarda SQL Server Management Studio başlatın.
Varsayılan kod sayfası olarak İngilizce (CP1252) bulunan bir veritabanına bağlanın.
Aşağıdaki sorguyu kullanarak veritabanında bir tablo oluşturun:
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
Aşağıdaki sorguyu kullanarak veritabanına Korece bir karakter ekleyin:
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
Aşağıdaki sorguyu kullanarak verileri almak için bir seçme sorgusu oluşturun:
SELECT * FROM tbTest
Aşağıdaki sonuçları alırsınız. A sütunundaki değer bir soru işaretidir.
A NA Comment
-------------------- ---------- --------------------
? 가 SQLServer/INSERT
Başvurular
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin