Jste nelze převést správně znak dat z klienta na server pomocí SQL Server ODBC driver Pokud znaková stránka klienta liší od kódu stránky serveru

Příznaky

Při použití MDAC 2.1 nebo novější verzi ovladače SQL Server ODBC (verze 3.70.0623 nebo novější) nebo OLEDB provider (verze 7.01.0623 nebo novější), za určitých okolností může dojít překlad znaková data na stránku kód serveru z klienta se znakovou stránkou, i když Autotranslation je zakázáno pro připojení.

Příčina

Autotranslation není pouze mechanismus, který může mít za následek převod znakových stránek. Ovladač SQL Server 7.0 ODBC a zprostředkovateli OLEDB zavádět nové chování při připojení k MSDE 1.0, SQL Server 7.0 nebo novější verze buď. Všechny příkazy SQL, které jsou odeslány jako jazyk události jsou převedeny na Unicode na straně klienta před odesláním na server. Účinek ukončení tohoto je podobný Autotranslation všech dat předávaných z klienta na server pomocí jazyka události, bez ohledu na aktuální nastavení Autotranslation pro připojení. To nezavedou žádné obtíže, s výjimkou při pokusu o uložení dat strojově přeložených znaků znakové stránky než stránky kód SQL Server.

Jak potíže obejít

Neukládejte data stránky X kód v kódové stránce A SQL Server (například kód stránky 950 data na serveru kód stránka 1252). Když to bylo možné za určitých okolností v předchozích verzích serveru SQL Server, vždy byla podporována. 1252 SQL Server jinou možnost než 1252 znak není platný znak data. Non-Unicode znaková data z různých kódu stránky nebudou seřazena správně a v případě dvou bajtů dat (DBCS), SQL Server nerozpozná znak hranice správně. To může způsobit vážné problémy, například problém popsaný v následujícím článku znalostní báze Microsoft Knowledge Base:
155723 INF: SQL Server zkrácení řetězce DBCS

Nejlepší volba pro SQL Server znaková stránka je znaková stránka klientů, kteří budou přistupovat k serveru.

Server a klient může mít různé znakové stránky, ale musíte zajistit, že Autotranslation je povolena na klienta tak, aby získat správný překlad dat na server kód stránky a ve všech případech.

Pokud váš server ukládat data z více znakových stránek, je podporované řešení pro uložení dat ve sloupcích Unicode (NCHAR nebo NVARCHAR/NTEXT).

Pokud vaše situace vyžaduje ukládání dat stránky X kód v kódové stránce A SQL Server, provést spolehlivě pouze dvěma způsoby:
  • Uložení dat ve sloupcích binární sloupců (BINARY/VARBINARY/IMAGE).
  • Zapsat aplikace pomocí vzdáleného volání procedur (RPC) pro všechny příkazy SQL, které se zabývají znaková data. Data odesílaná prostřednictvím vzdáleného volání Procedur události není předmětem tohoto převodu. Všimněte si, že není nic na úrovni DSN, který lze změnit na typ událostí, které jsou odesílány nebo ovladač. Zda je odeslán příkaz jako jazyk nebo vzdáleného volání Procedur událostí zcela závisí na rozhraní API a syntaxe zvolí programátor při zápisu aplikace.

Další informace

Autotranslation (to znamená "Provést překlad znaková data" zaškrtávacích políček v novější aplikace ODBC) převede znaková data z klienta se znakovou stránkou kódová stránka serveru před jejich odesláním na server pomocí kódování Unicode jako střední překladu. 3,7 ovladač SQL Server ODBC však převede všechny příkazy SQL, které jsou odeslány jako události jazyka kódování Unicode před jejich uvedením na lince, která má efekt, který je podobný Autotranslation, ale neřídí nastavení Autotranslation. Naopak znaková data vyplývající ze serveru zpět klientům respektovat příznak Autotranslation; Pokud je Autotranslation vypnuto data dorazí klienta aplikace pomocí stejné znakové kódy jako data byla na serveru. Překlad údajů klient server vzdáleného volání Procedur událostí Podobně lze zakázat vypnutím Autotranslation. Následuje jednoduchý skript, který demonstruje, jak toto chování ovlivňuje jazyk události. V tomto příkladu byl spuštěn z Query Analyzer kód stránka 1252 klienta připojujícího se k serveru kód stránky 437:
-- 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)
Poznámka: následující o předchozím příkladu:
  • Přestože Autotranslation byl vypnutý během této dávkové úlohy, kód znaku 165 (jen v kódová stránka 1252) byl převeden do 157 (jen v znakovou stránku 437). Důvodem je, že ovladač ODBC SQL řetězec převést do kódování Unicode před odesláním server, aby bylo možné převést na odpovídající znak pro úložiště znakovou stránku 437 serveru.
  • Při klienta VYBRAT a načíst data, která byla právě uloženy, znak 157 dorazily nepřevedených klienta (157 se zobrazí jako pole "" v klientském počítači kód stránka 1252). Důvodem je převod popisované v tomto článku platí pouze pro data odesílaná z klienta na server, nikoli ze serveru do klienta. Data nebyla přeložena, vzhledem k tomu, že je toto nastavení Autotranslation vypnuto.

-- 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)
V tomto případě zpět zapnutí Autotranslation neměla žádný vliv na překlad z klienta na server (to znamená, že stejné správný překlad z kód znaku 165 kódu znaku 157 se stalo), ale to mít vliv na data načtená ze serveru. Všimněte si, že spustíte-li příkaz SELECT tentokrát (s Autotranslation na), symboly jenu zobrazit správně v aplikaci kód stránka 1252 protože mohou mít byly přeloženy z kódu znaku 157 zpět na kód znaku 165 mechanismem Autotranslation.

Toto chování (převod události jazyka kódování Unicode na straně klienta) se zobrazí při použití jakékoli SQL Server ODBC driver verze 3.70 nebo novější a připojování k serveru SQL Server 7.0 nebo novější. Nedojde při použití starších ovladačů rozhraní ODBC, nebo při použití 3,7 ovladač pro připojení k serveru SQL Server 6.5 nebo starším. Kromě toho pokud jsou uložením dat ve sloupcích Unicode (NCHAR nebo NVARCHAR/NTEXT) převod nebude problém.
Další informace o způsobu znak data jsou reprezentována v SQL Server 2005 klepněte na následující číslo článku databáze Microsoft Knowledge Base:

904803 znak data jsou reprezentována nesprávně při znaková stránka počítače klienta se liší od kódu stránky databáze SQL Server 2005

Vlastnosti

ID článku: 234748 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor