Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 ,varcharoftexthet 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 Translateparameter genoemd) is uitgeschakeld. DeAuto Translateparameter is een parameter van deConnectionStringeigenschap 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:
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;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 TranslateparameterFalsevervolgens 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:
Start SQL Server Management Studio op de clientcomputer met Koreaans (CP949) als standaardcodepagina.
Maak verbinding met een database met Engels (CP1252) als standaardcodepagina.
Maak een tabel in de database met behulp van de volgende query:
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))Voeg een Koreaans teken in de database in met behulp van de volgende query:
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')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