Delen via


Tekengegevens worden onjuist weergegeven wanneer de codepagina van de clientcomputer verschilt van de database

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 904803

Symptomen

Bekijk het volgende scenario:

  • U gebruikt SQL Server Management Studio om query's uit te voeren op tekengegevens uit een SQL Server-database die gebruikmaakt van een niet-Unicode-gegevenstype. De SQL Server-database maakt bijvoorbeeld gebruik van het chargegevenstype , varcharof text het gegevenstype.

  • De codepagina van de clientcomputer verschilt van de codepagina van de database. De codepagina is gekoppeld aan de sortering van de database.

In dit scenario worden tekengegevens onjuist weergegeven.

U kunt bijvoorbeeld een van de volgende problemen ondervinden:

  • De tekengegevens worden weergegeven als een vraagteken (?). Mogelijk ziet u dit probleem als u de tekengegevens invoegt of bijwerkt als een niet-Unicode-gegevenstype voordat u een query uitvoert op de tekengegevens. Dit probleem treedt op als u deze wijziging aanbrengt met behulp van SQL Server Management Studio op een clientcomputer met een andere codepagina.

  • De tekengegevens worden weergegeven als beschadigde gegevens. De tekengegevens van codepagina X worden opgeslagen in een niet-Unicode-kolom met codepagina Y. Daarnaast worden de tekengegevens niet vertaald. Dit probleem treedt op wanneer u query's uitvoert op de tekengegevens met behulp van SQL Server Management Studio.

    Notitie

    Wanneer u een query uitvoert op de tekengegevens met behulp van SQL Server Management Studio, worden de tekengegevens correct weergegeven als de vertaalfunctie voor tekengegevens (ook wel de Auto Translate parameter genoemd) is uitgeschakeld. De Auto Translate parameter is een parameter van de ConnectionString eigenschap voor Microsoft OLE DB Provider voor SQL Server en voor Microsoft .NET Framework Data Provider voor OLE DB.

Oorzaak

Dit probleem treedt op omdat de tekengegevens van codepagina X worden opgeslagen in een niet-Unicode-kolom van codepagina Y, die niet wordt ondersteund.

Wanneer u in SQL Server een letterlijke tekenreeks van een niet-Unicode-gegevenstype gebruikt, wordt de letterlijke tekenreeks geconverteerd met behulp van de standaardcodepagina van de database die is afgeleid van de sortering van de database. Het opslaan van de tekengegevens van codepagina X in een kolom met codepagina Y kan leiden tot gegevensverlies of beschadiging van gegevens.

Als de tekengegevens worden weergegeven als beschadigde gegevens, kunnen de gegevens alleen correct worden weergegeven als u de Auto Translate parameter voor Microsoft OLE DB-provider voor SQL Server of Microsoft .NET Framework-gegevensprovider voor OLE DB uitschakelt.

Notitie

SQL Server Management Studio maakt gebruik van Microsoft .NET Framework Data Provider voor SQL Server om verbinding te maken met de SQL Server-database. Deze gegevensprovider biedt geen ondersteuning voor de Auto Translate parameter.

Tijdelijke oplossing

Gebruik een van de volgende methoden om dit probleem te omzeilen:

Methode 1: Een Unicode-gegevenstype gebruiken in plaats van een niet-Unicode-gegevenstype

Wijzig de kolommen in een Unicode-gegevenstype om alle problemen te voorkomen die worden veroorzaakt door het vertalen van codepagina's. Gebruik bijvoorbeeld het nchargegevenstype , nvarcharof ntext het gegevenstype.

Methode 2: Een geschikte sortering gebruiken voor de database

Als u een niet-Unicode-gegevenstype moet gebruiken, moet u er altijd voor zorgen dat de codepagina van de database en de codepagina van niet-Unicode-kolommen de niet-Unicode-gegevens correct kunnen opslaan. Als u bijvoorbeeld codepaginagegevens van 949 (Koreaans) wilt opslaan, gebruikt u een Koreaanse sortering voor de database. Gebruik bijvoorbeeld de Korean_Wansung_CI_AS sortering voor de database.

Methode 3: Het gegevenstype binair of varbinary gebruiken

Als u wilt dat de database de exacte bytewaarden rechtstreeks opslaat en ophaalt van de tekens die worden verwerkt zonder de juiste codepaginavertaling uit te voeren, gebruikt u het binary of varbinary gegevenstype.

Methode 4: Een ander hulpprogramma gebruiken om gegevens op te slaan en op te halen en de parameter Automatisch vertalen uit te schakelen

Waarschuwing

We testen of ondersteunen het opslaan van de tekengegevens van codepagina X niet in een kolom met codepagina Y. Deze bewerking kan leiden tot taalkundig onjuiste queryresultaten, onjuiste overeenkomsten of volgorde van tekenreeksen en onverwachte conversie van codepagina's (gegevensbeschadiging). We raden u aan een van de andere methoden te gebruiken om dit probleem te omzeilen.

Wanneer u Microsoft OLE DB Provider voor SQL Server gebruikt om verbinding te maken met een database met een andere codepagina en u probeert een query uit te voeren op tekengegevens uit een niet-Unicode-gegevenstypekolom, moet u ervoor zorgen dat u de niet-vertaalde tekens in de database opslaat.

Notitie

In het volgende voorbeeld wordt ervan uitgegaan dat de codepagina van de clientcomputer Koreaans (CP949) is en dat de codepagina van de SQL Server-database Engels (CP1252) is. U moet de tijdelijke aanduidingen in de codevoorbeelden vervangen door waarden die geschikt zijn voor uw situatie.

Volg deze stappen om dit probleem te omzeilen:

  1. Converteer de tekens handmatig naar onbewerkte gegevens en voeg de gegevens vervolgens in de database in met behulp van de codepagina van de database. Als u deze bewerking wilt uitvoeren, gebruikt u een codefragment dat vergelijkbaar is met de volgende code:

    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. Als u een query wilt uitvoeren op de gegevens, gebruikt u Microsoft OLE DB Provider voor SQL Server of Microsoft .NET Framework Data Provider voor SQL Server om verbinding te maken met de database en stelt u de Auto Translate parameter Falsevervolgens in op . Als u deze bewerking wilt uitvoeren, gebruikt u een codefragment dat vergelijkbaar is met de volgende code:

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

Meer informatie

Volg deze stappen om het probleem te reproduceren:

  1. Start SQL Server Management Studio op de clientcomputer met Koreaans (CP949) als standaardcodepagina.

  2. Maak verbinding met een database met Engels (CP1252) als standaardcodepagina.

  3. Maak een tabel in de database met behulp van de volgende query:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Voeg een Koreaans teken in de database in met behulp van de volgende query:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. Maak een selectiequery om de gegevens op te halen met behulp van de volgende query:

    SELECT * FROM tbTest
    

U ontvangt de volgende resultaten. De waarde in kolom A is een vraagteken.


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

Verwijzingen