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.
Dit artikel helpt u bij het omzeilen van een probleem dat een onjuiste vertaling van clientgegevens veroorzaakt bij het gebruik van het ODBC-stuurprogramma van SQL Server.
Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 234748
Symptomen
Wanneer u de MDAC 2.1 of nieuwere versie van het ODBC-stuurprogramma van SQL Server (versie 3.70.0623 of hoger) of de OLEDB-provider (versie 7.01.0623 of hoger) gebruikt, kunt u onder bepaalde omstandigheden te maken hebben met het vertalen van tekengegevens van de clientcodepagina naar de servercodepagina, zelfs wanneer Autotranslation
deze is uitgeschakeld voor de verbinding.
Oorzaak
Autotranslation
is niet het enige mechanisme dat kan leiden tot conversie van codepagina's. Het ODBC-stuurprogramma van SQL Server 7.0 en de OLEDB-provider introduceren een nieuw gedrag bij het maken van verbinding met MSDE 1.0, SQL Server 7.0 of latere versies van beide. Alle SQL-instructies die als een taalgebeurtenis worden verzonden, worden geconverteerd naar Unicode op de client voordat ze naar de server worden verzonden. Het eindeffect is vergelijkbaar met een Autotranslation
van alle gegevens die van de client naar de server stromen via een taalgebeurtenis, ongeacht de huidige Autotranslation
instelling voor de verbinding. Het zal geen problemen veroorzaken, behalve bij het opslaan van niet-vertaalde tekengegevens van een andere codepagina dan de codepagina van SQL Server.
Tijdelijke oplossing
Sla geen codepagina X-gegevens op in een codepagina Y SQL Server (bijvoorbeeld codepagina 950-gegevens op een codepagina 1252-server). Hoewel dit in sommige omstandigheden mogelijk was met eerdere versies van SQL Server, is dit altijd niet ondersteund. Voor een SQL Server van 1252 is alles behalve een 1252-teken geen geldige tekengegevens. Niet-Unicode-tekengegevens van een andere codepagina worden niet correct gesorteerd en in het geval van DBCS-gegevens (dual-byte) herkent SQL Server geen tekengrenzen correct. Dit kan aanzienlijke problemen veroorzaken.
De beste keuze voor de codepagina van SQL Server is de codepagina van de clients die toegang hebben tot de server.
De server en client kunnen verschillende codepagina's hebben, maar u moet ervoor zorgen dat Automatische omzetting is ingeschakeld op de client, zodat u in alle gevallen de juiste vertaling van gegevens naar en van de codepagina van de server krijgt.
Als uw server gegevens van meerdere codepagina's moet opslaan, is de ondersteunde oplossing het opslaan van de gegevens in Unicode-kolommen (NCHAR/NVARCHAR/NTEXT
).
Als uw situatie vereist dat u codepagina X-gegevens opslaat in een codepagina Y SQL Server, zijn er slechts twee manieren om dit betrouwbaar te doen:
- Sla de gegevens op in binaire kolommen (
BINARY/VARBINARY/IMAGE
) kolommen. - Schrijf uw toepassing om Remote Procedure Calls (RPC's) te gebruiken voor alle SQL-instructies die betrekking hebben op tekengegevens. Gegevens die via een RPC-gebeurtenis worden verzonden, zijn niet onderhevig aan de conversie. Er is niets op stuurprogramma- of DSN-niveau dat u kunt doen om het type gebeurtenissen te wijzigen dat wordt verzonden. Of een opdracht wordt verzonden als een taal of RPC-gebeurtenis, is volledig afhankelijk van de API's en syntaxis die door de programmeur worden gekozen wanneer de toepassing wordt geschreven.
Meer informatie
Met automatische omzetting (met de selectievakjes Vertaling voor tekengegevens uitvoeren in nieuwere ODBC-toepassingen) worden tekengegevens van de clientcodepagina geconverteerd naar de servercodepagina voordat de gegevens naar de server worden verzonden, met Unicode als vertaalmedium. Het ODBC-stuurprogramma van 3.7 SQL Server converteert echter ook alle SQL-instructies die als een taalgebeurtenis naar Unicode worden verzonden voordat ze op de draad worden geplaatst, wat een effect heeft dat vergelijkbaar is met Automatisch vertalen, maar niet wordt beheerd door de instelling voor automatisch vertalen. Tekengegevens die van de server naar de clients stromen, respecteren daarentegen de vlag voor automatisch vertalen; als automatisch omzetten is uitgeschakeld, komen de gegevens in de clienttoepassing aan met dezelfde tekencodes als de gegevens op de server. Op dezelfde manier kan de vertaling van gegevens voor RPC-gebeurtenissen van client naar server worden uitgeschakeld door Automatische omzetting uit te schakelen. Een eenvoudig script dat laat zien hoe het gedrag van invloed is op taalevenementen. Dit voorbeeld is uitgevoerd vanuit Query Analyzer op een codepagina 1252-client die verbinding maakt met een codepagina 437-server:
-- Turn Autotranslation off here.
USE tempdb
GO
CREATE TABLE t1 (c1 int, c2 char(1))
GO
-- Enter a yen character, using the keystroke ALT-0165.
INSERT INTO t1 VALUES (1, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1 c2
----------- ---- -----------
1 157
(1 row(s) affected)
Het volgende over het voorgaande voorbeeld:
Autotranslation
Hoewel deze partij was uitgeschakeld, werd de tekencode 165 (yen in codepagina 1252) geconverteerd naar 157 (yen in codepagina 437). Dit komt doordat het ODBC-stuurprogramma de SQL-tekenreeks heeft geconverteerd naar Unicode voordat deze de server verzendt, zodat de server deze kon converteren naar het juiste teken voor opslag in codepagina 437.- Wanneer de client een SELECT heeft uitgevoerd om de gegevens op te halen die zijn opgeslagen, is het teken 157 niet vertaald op de client (157 wordt weergegeven als een vak '' op een codepagina 1252-client). Dit komt doordat de conversie die in dit artikel wordt besproken alleen van toepassing is op gegevens die van de client naar de server worden verzonden, niet van de server naar de client. De gegevens zijn niet vertaald omdat de
Autotranslation
instelling is uitgeschakeld.
-- Turn Autotranslation back on before running the following batch.
INSERT INTO t1 VALUES (2, '¥')
SELECT c1, c2, ASCII (c2) FROM t1
c1 c2
----------- ---- -----------
1 ¥ 157
2 ¥ 157
(2 row(s) affected)
In dit geval had het weer inschakelen Autotranslation
geen effect op de vertaling van de client naar de server (dus dezelfde juiste vertaling van tekencode 165 naar tekencode 157, maar het heeft wel effect gehad op de gegevens die van de server zijn opgehaald. Wanneer de SELECT-instructie deze keer wordt uitgevoerd (met Autotranslation
ingeschakeld), worden de yensymbolen correct weergegeven in de codepagina 1252, omdat deze zijn vertaald van tekencode 157 terug naar tekencode 165 door het Autotranslation
mechanisme.
U ziet dit gedrag (conversie van taalevenementen naar Unicode op de client) wanneer u een ODBC-stuurprogrammaversie 3.70 of hoger van SQL Server gebruikt en verbinding maakt met SQL Server 7.0 of hoger. Dit gebeurt niet wanneer u oudere ODBC-stuurprogramma's gebruikt of wanneer u het 3.7-stuurprogramma gebruikt om verbinding te maken met SQL Server 6.5 of eerder. Als u uw gegevens opslaat in Unicode-kolommen (NCHAR/NVARCHAR/NTEXT
) is de conversie bovendien geen probleem.
Zie Voor meer informatie over hoe tekengegevens worden weergegeven in SQL Server 2005, tekengegevens onjuist weergegeven wanneer de codepagina van de clientcomputer verschilt van de codepagina van de database in SQL Server 2005.