Symptomen

Wanneer u de MDAC 2.1- of latere versie van de SQL Server ODBC-stuurprogramma (versie 3.70.0623 of hoger) of de OLEDB-provider (versie 7.01.0623 of hoger), onder bepaalde omstandigheden treden vertaling van tekengegevens van de codetabel van de client naar de server codetabel, zelfs als de Autotranslation voor de verbinding is uitgeschakeld.

Oorzaak

Autotranslation is niet het enige mechanisme dat leiden Codetabelconversie tot kan. De SQL Server 7.0 ODBC-stuurprogramma en de OLEDB-provider introduceren een nieuw gedrag bij het verbinding maken met MSDE 1.0, SQL Server 7.0 of hoger uit. Alle SQL-instructies als een taal gebeurtenis verzonden worden naar Unicode geconverteerd op de client voordat ze worden verzonden naar de server. Het eind resultaat is vergelijkbaar met een Autotranslation van alle gegevens die van de client naar de server via een gebeurtenis taal, ongeacht de huidige instelling van de Autotranslation voor de verbinding. Dit leidt niet tot moeilijkheden, behalve wanneer poging voor het opslaan van tekengegevens uit een andere codetabel dan de codetabel van SQL Server niet vertaald.

Tijdelijke oplossing

Sla geen code pagina X-gegevens in een codetabel Y SQL Server (bijvoorbeeld code 950 paginagegevens op een server code pagina 1252). Terwijl dit in sommige gevallen met eerdere versies van SQL Server mogelijk was, is het niet ondersteund. Een SQL Server 1252 andere waarde dan een 1252 is teken niet geldig tekengegevens. Gegevens uit een andere codepagina in niet-Unicode-tekens worden niet correct gesorteerd en in het geval van dubbele bytes (DBCS) gegevens, SQL Server niet worden herkend door teken grenzen goed. Dit kan ertoe leiden dat belangrijke problemen, zoals het probleem dat wordt beschreven in het volgende artikel in de Microsoft Knowledge Base:

155723 , INF: SQL Server PST-bestanden van een DBCS-tekenreeks

De beste keuze voor de codetabel van SQL Server is de codetabel van de clients die toegang hebben tot de server.

De server en de client kunnen verschillende codepagina's hebben, maar moet u ervoor zorgen dat Autotranslation is ingeschakeld op de client, zodat u de juiste vertaling van gegevens van en naar de codepagina van de server zich in alle gevallen.

Als uw server moet gegevens uit meerdere codepagina's worden opgeslagen, is de ondersteunde oplossing voor het opslaan van de gegevens in kolommen Unicode (NCHAR/NVARCHAR/NTEXT).

Als uw situatie vereist dat u code pagina X gegevens opslaan in een codetabel Y SQL Server, zijn er slechts twee manieren om dit te doen op betrouwbare wijze:

  • De gegevens in kolommen met binaire kolommen (VARBINARY-binaire bestand/afbeelding) opslaan.

  • Schrijf uw toepassing Remote Procedure Calls (RPC's) voor alle SQL-instructies die betrekking op tekengegevens hebben. Gegevens die worden verzonden via een RPC-gebeurtenis kan niet door deze conversie. Houd er rekening mee dat er niets aan het stuurprogramma of de DSN die u doen is kunt om het type wijzigen van gebeurtenissen die worden verzonden. Of een opdracht wordt verzonden als een taal of RPC-gebeurtenis is volledig afhankelijk van de API's en de syntaxis die door de programmeur worden gekozen wanneer de toepassing is geschreven.

Meer informatie

Autotranslation (dat wil zeggen de selectievakjes "Vertaling uitvoeren voor tekengegevens" in het nieuwere ODBC-toepassingen) omgezet in tekengegevens van de codetabel van de client de servercodepagina voordat de gegevens worden verzonden naar de server, Unicode gebruikt als een medium voor de vertaling. De 3.7 SQL Server ODBC-stuurprogramma geconverteerd echter ook alle SQL-instructies als een gebeurtenis taal naar Unicode verzonden voordat de draad met een effect dat lijkt op Autotranslation maar niet wordt geregeld door de instelling van de Autotranslation brengen. Daarentegen tekengegevens die voortvloeien uit de server terug naar de clients met inachtneming van de vlag Autotranslation; Als Autotranslation is uitgeschakeld gegevens aankomt op de client-toepassing met de tekencodes dezelfde als de gegevens op de server heeft. Vertaling van gegevens voor de client-naar-server RPC-gebeurtenissen kan ook worden uitgeschakeld door het uitschakelen van Autotranslation. Er volgt een eenvoudig script dat laat zien hoe dit probleem geldt voor taal-gebeurtenissen. In dit voorbeeld is op een code pagina 1252-client verbinding maakt met een code pagina 437 server uitvoeren vanaf Query Analyzer:

-- 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)

Houd rekening met het volgende over het vorige voorbeeld:

  • Hoewel Autotranslation uitgeschakeld tijdens deze batch was, is de tekencode 165 (yen in codetabel 1252) geconverteerd naar 157 (yen in de codetabel 437). Dit komt omdat het ODBC-stuurprogramma voor de SQL-tekenreeks naar Unicode geconverteerd voordat u deze verzendt de de server, zodat de server om deze te converteren naar het juiste teken voor opslag in de codetabel 437 kon.

  • Wanneer de client wordt uitgevoerd een selecteren voor het ophalen van de gegevens die alleen zijn opgeslagen, het teken 157 aangekomen niet vertaald in de client (157 wordt weergegeven als een vak "" op een client code pagina 1252). Dit komt omdat de conversie besproken in dit artikel is alleen van toepassing op gegevens die van de client naar de server, niet vanuit de server naar de client worden verzonden. De gegevens is niet vertaald, omdat de instelling van de Autotranslation uitgeschakeld is.


-- 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 Autotranslation weer in te schakelen geen invloed heeft op de vertaling van de client naar de server (dat wil zeggen, dezelfde juiste vertaling van tekencode 165 om tekencode 157 is gebeurd), maar het heeft een effect op de gegevens opgehaald van de server. Houd er rekening mee dat wanneer de SELECT -instructie wordt nu uitgevoerd (met Autotranslation op), de yen symbolen juist in de toepassing code pagina 1252 weergegeven omdat ze zijn vertaald vanuit de tekencode 157 terug naar tekencode 165 door de Autotranslation mechanisme.

Ziet u dit gedrag (conversie van gebeurtenissen taal naar Unicode op de client) als met behulp van een SQL Server ODBC-stuurprogrammaversie 3.70 en verbinding maakt met SQL Server 7.0 of hoger. Dit gebeurt niet wanneer met oudere ODBC-stuurprogramma's, of wanneer de 3,7 stuurprogramma verbinding maken met SQL Server 6.5 of eerder gebruikt. Bovendien, als u uw gegevens in de Unicode-kolommen opslaat (NCHAR/NVARCHAR/NTEXT) de conversie niet worden een probleem.

Voor meer informatie over de manier waarop tekengegevens in SQL Server 2005 wordt weergegeven, klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base:

904803 tekengegevens wordt vertegenwoordigd niet goed wanneer de codetabel van de client van de codetabel van de database in SQL Server 2005 verschilt

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Hoe tevreden bent u met de taalkwaliteit?
Wat heeft uw ervaring beïnvloed?

Bedankt voor uw feedback.

×