Aracılığıyla paylaş


İ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 değerlendirin:

  • Unicode olmayan bir veri türü kullanan bir SQL Server veritabanından karakter verilerini sorgulamak için SQL Server Management Studio'yu 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 temsil edilir. 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ına sahip 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, SQL Server Management Studio kullanarak karakter verilerini sorguladığınızda oluşur.

    Not

    SQL Server Management Studio kullanarak karakter verilerini sorguladığınızda, Karakter verileri için çeviri gerçekleştir ayarı (parametre olarak Auto Translate da bilinir) devre dışı bırakılırsa karakter verileri doğru şekilde gösterilir. Auto Translate parametresi, SQL Server için Microsoft OLE DB Sağlayıcısı ve OLE DB için Microsoft .NET Framework Veri Sağlayıcısı için özelliğinin parametresidirConnectionString.

Neden

Bu sorun, X kod sayfasının karakter verilerinin desteklenmeyen Y kod sayfasının Unicode olmayan bir sütununda depolanmasından kaynaklanır.

SQL Server'da, Unicode olmayan bir veri türünün dize değişmez değeri kullandığınızda, dize değişmez değeri veritabanının harmanlamasından türetilen varsayılan kod sayfası kullanılarak 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 veriler olarak gösteriliyorsa, veriler yalnızca SQL Server için Microsoft OLE DB Sağlayıcısı parametresini veya OLE DB için Microsoft .NET Framework Veri Sağlayıcısı 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ı kullanır. Bu veri sağlayıcısı parametresini Auto Translate desteklemez.

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 bir şekilde depolayadığı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ı çevirisi 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ının bir 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.

Sql Server için Microsoft OLE DB Sağlayıcısı'nı kullanarak farklı bir kod sayfasına sahip bir veritabanına bağlandığı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ı 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ı kullanın ve parametresini Auto Translate 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'yu 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 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