İ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ı , varcharveya text 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, , nvarcharveya 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:

  1. 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;
    
  2. 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 olarak Falseayarlayı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:

  1. Varsayılan kod sayfası olarak Korece (CP949) bulunan istemci bilgisayarda SQL Server Management Studio başlatın.

  2. Varsayılan kod sayfası olarak İngilizce (CP1252) bulunan bir veritabanına bağlanın.

  3. Aşağıdaki sorguyu kullanarak veritabanında bir tablo oluşturun:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Aşağıdaki sorguyu kullanarak veritabanına Korece bir karakter ekleyin:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. 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