Objawy

Podczas korzystania z wersji MDAC 2.1 lub nowszą wersję sterownika ODBC programu SQL Server (w wersji 3.70.0623 lub nowszym) lub Dostawca OLE DB (wersji 7.01.0623 lub nowszej), w niektórych okolicznościach może wystąpić translacji danych znakowych ze strony kodowej klienta na serwerze Strona kodowa, nawet wtedy, gdy Autotranslation jest wyłączona dla tego połączenia.

Przyczyna

Autotranslation nie jest jedynym mechanizmem, który może spowodować konwersję stron kodowych. Sterownik ODBC programu SQL Server 7.0 i Dostawca OLE DB wprowadzono nowe zachowanie, podczas nawiązywania połączenia MSDE 1.0, program SQL Server 7.0 lub nowszym albo. Wszystkie instrukcje SQL wysyłane jako zdarzenia języka są konwertowane na standard Unicode na kliencie przed wysłaniem do serwera. Efekt końcowy jest podobny do Autotranslation wszystkie dane przepływające od klienta do serwera za pośrednictwem zdarzenia języka, niezależnie od bieżącego ustawienia Autotranslation dla połączenia. Nie wprowadzi wszelkie trudności, z wyjątkiem przypadków, gdy próbujesz zapisać dane znakowe nieprzeliczonych ze strony kodowej innych niż strona kodowa serwera SQL.

Obejście problemu

Nie należy przechowywać dane X strony kodowej w stronie kodowej Y programu SQL Server (na przykład dane strony kodowej 950 w serwer kod strony 1252). Podczas gdy było to możliwe w pewnych okolicznościach z poprzednich wersji programu SQL Server, zawsze był nieobsługiwane. Do programu SQL Server 1252 nic, ale 1252 znak nie jest prawidłowym znakiem danych. Dane znaków standardu Unicode z inną stronę kodową nie będą poprawnie sortowane, a w przypadku podwójny bajt danych (DBCS), program SQL Server nie rozpozna granic znak poprawnie. Może to spowodować znaczne problemy, takie jak problem opisany w następującym artykule z bazy wiedzy Microsoft Knowledge Base:

155723 INF: SQL Server obcięcie ciągu DBCS

Najlepszy wybór dla strona kodowa serwera SQL jest strona kodowa klientów, którzy będą uzyskiwać dostęp do serwera.

Serwer i klient może mieć różne strony kodowe, ale upewnij się, że Autotranslation jest włączona na komputerze klienckim, tak aby uzyskać stosowne tłumaczenie danych z strona kodowa serwera i we wszystkich przypadkach.

Jeśli serwer musi przechowywać dane z wielu stron kodowych, obsługiwane rozwiązaniem jest przechowywanie danych w kolumnach Unicode (NCHAR/NVARCHAR/NTEXT).

Jeśli danej sytuacji wymaga przechowywania danych strony X kod w stronie kodowej Y programu SQL Server, istnieją tylko dwa sposoby, w tym w wiarygodny sposób:

  • Przechowywanie danych w kolumnach binary kolumny (BINARNE VARBINARY/obraz).

  • Napisz przebudować aplikację za pomocą zdalnego wywołania procedury (RPC) dla wszystkich instrukcji SQL, które zajmują się danych znakowych. Dane przesyłane za pośrednictwem zdarzenia RPC nie podlega tej konwersji. Należy zauważyć, że nie ma nic na poziomie DSN, co można zrobić, aby zmienić typ zdarzenia wysyłane lub sterownika. Czy polecenie jest wysyłane jako język lub zdarzenia RPC zależy całkowicie od interfejsów API i składni wybrane przez programistę, gdy aplikację napisano.

Więcej informacji

Autotranslation (to znaczy "Wykonaj translację danych znakowych" pola wyboru w nowszych aplikacji ODBC) konwertuje dane znakowe ze strony kodowej klienta strona kodowa serwera przed wysłaniem danych na serwer, jako środek tłumaczenia przy użyciu standardu Unicode. 3.7 sterownika ODBC programu SQL Server konwertuje również wszystkie instrukcje SQL wysyłane jako zdarzenia języka na standard Unicode, przed umieszczeniem ich w sieci, która jest efekt, który jest podobny do Autotranslation, ale nie jest regulowana przez ustawienie Autotranslation. Natomiast dane znakowe wypływających z serwera do klientów respektować flagi Autotranslation; Jeśli Autotranslation jest wyłączona na komputerze klienckim nadejścia danych aplikacji z tych samych kodów znaków jako dane miał na serwerze. Podobnie tłumaczenie danych klient serwer RPC zdarzeń można wyłączyć przez wyłączenie opcji Autotranslation. Prosty skrypt, który pokazuje, jak jest to zachowanie zdarzenia języka wpływa na następujące. W tym przykładzie była uruchamiana z analizatora kwerend na kliencie kodu strony 1252 łączenia się z serwerem 437 strony kodu:

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

Poniższe informacje o poprzednim przykładzie:

  • Mimo że Autotranslation był wyłączony podczas tej partii, kod znaku 165 (jen w stronie kodowej 1252) została przekonwertowana na 157 (jen w stronie kodowej 437). To dlatego sterownik ODBC ciąg SQL konwertowane na standard Unicode przed wysłaniem go na serwer, więc serwer był w stanie przekonwertować go na odpowiedni znak do składowania w stronie kodowej 437.

  • Jeśli klient został uruchomiony, Wybierz do pobierania danych, który miał po prostu przechowywane, znak 157 przybył nieprzeliczonych po stronie klienta (157 pojawia się jako pole "" na kliencie kodu strony 1252). To dlatego konwersji omówione w tym artykule dotyczą tylko dane wysyłane z klienta do serwera, a nie z serwera do klienta. Dane nie została przetłumaczona, ponieważ ustawienie Autotranslation jest wyłączone.


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

W takim przypadku, włączając Autotranslation nie miał wpływu na tłumaczenie od klienta do serwera (czyli sam poprawne tłumaczenie z kodem znaku 165 do kodu znaku 157 stało się), ale miał wpływ na dane pobierane z serwera. Należy zauważyć, że uruchomienie instrukcji SELECT jest tym razem (z Autotranslation na), jena symbole są wyświetlane poprawnie w aplikacji kod strony 1252 ponieważ one zostały przetłumaczone z kodem znaku 157 do kodu znaku 165 przez Autotranslation mechanizm.

Kiedy zobaczysz to zachowanie (Konwersja języka zdarzeń na Unicode na komputerze klienckim) przy użyciu dowolnego SQL Server ODBC driver wersja 3.70 lub nowszego oraz nawiązywanie łączności z programem SQL Server 7.0 lub nowszym. Nie nastąpi, gdy starsze sterowniki ODBC lub za pomocą sterownika 3,7 do połączenia programu SQL Server 6.5 lub starszej. Ponadto jeśli dane są przechowywane w kolumnach Unicode (NCHAR/NVARCHAR/NTEXT) konwersja nie będzie problemu.

Aby uzyskać więcej informacji o tym, jak dane znakowe jest reprezentowane w programie SQL Server 2005 kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

904803 danych znakowych jest reprezentowana niepoprawnie, gdy strona kodowa komputera klienta różni się od strony kodowej bazy danych w programie SQL Server 2005

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Jaka jest jakość języka?
Co wpłynęło na Twoje wrażenia?

Dziękujemy za opinię!

×