Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 904803
Symptomy
Rozważmy następujący scenariusz:
Program SQL Server Management Studio umożliwia wykonywanie zapytań dotyczących danych znaków z bazy danych programu SQL Server używającej typu danych innych niż Unicode. Na przykład baza danych programu SQL Server używa
chartypu danych ,varcharlubtext.Strona kodowa komputera klienckiego różni się od strony kodowej bazy danych. Strona kodowa jest skojarzona z sortowaniem bazy danych.
W tym scenariuszu dane znaków są reprezentowane niepoprawnie.
Na przykład może wystąpić jeden z następujących problemów:
Dane znaków są reprezentowane jako znak zapytania (
?). Ten problem może wystąpić, jeśli wstawisz lub zaktualizujesz dane znaków jako typ danych innych niż Unicode przed wykonaniem zapytania o dane znaków. Ten problem występuje w przypadku wprowadzenia tej zmiany przy użyciu programu SQL Server Management Studio na komputerze klienckim, który ma inną stronę kodową.Dane znaków są reprezentowane jako uszkodzone dane. Dane znaków strony kodowej X są przechowywane w kolumnie innej niż Unicode strony kodowej Y. Ponadto dane znaków nie są tłumaczone. Ten problem występuje podczas wykonywania zapytań dotyczących danych znaków przy użyciu programu SQL Server Management Studio.
Uwaga 16.
Podczas wykonywania zapytań dotyczących danych znaków przy użyciu programu SQL Server Management Studio dane znaków są reprezentowane poprawnie, jeśli ustawienie Wykonaj tłumaczenie danych znaków (znane również jako
Auto Translateparametr) jest wyłączone. ParametrAuto Translatejest parametremConnectionStringwłaściwości dostawcy Microsoft OLE DB dla programu SQL Server i programu Microsoft .NET Framework Dostawca danych dla OLE DB.
Przyczyna
Ten problem występuje, ponieważ dane znaków strony kodowej X są przechowywane w kolumnie innej niż Unicode strony kodowej Y, która nie jest obsługiwana.
W programie SQL Server, gdy używasz literału ciągu typu danych innego niż Unicode, literał ciągu jest konwertowany przy użyciu domyślnej strony kodowej bazy danych pochodzącej z sortowania bazy danych. Przechowywanie danych znaków strony kodowej X w kolumnie strony kodowej Y może spowodować utratę danych lub uszkodzenie danych.
Jeśli dane znaków są reprezentowane jako uszkodzone dane, dane mogą być reprezentowane tylko wtedy, gdy wyłączysz Auto Translate parametr dostawcy MICROSOFT OLE DB dla programu SQL Server lub Microsoft .NET Framework Dostawca danych dla OLE DB.
Uwaga 16.
Program SQL Server Management Studio używa programu Microsoft .NET Framework Dostawca danych dla programu SQL Server w celu nawiązania połączenia z bazą danych programu SQL Server. Ten dostawca danych nie obsługuje parametru Auto Translate .
Rozwiązanie
Aby obejść ten problem, użyj jednej z następujących metod:
Metoda 1. Użyj typu danych Unicode zamiast typu danych innych niż Unicode
Zmień kolumny na typ danych Unicode, aby uniknąć wszystkich problemów spowodowanych tłumaczeniem strony kodu. Na przykład użyj nchartypu danych , nvarcharlub ntext .
Metoda 2. Użyj odpowiedniego sortowania dla bazy danych
Jeśli musisz użyć typu danych innego niż Unicode, zawsze upewnij się, że strona kodowa bazy danych i strona kodowa dowolnych kolumn innych niż Unicode mogą poprawnie przechowywać dane inne niż Unicode. Jeśli na przykład chcesz przechowywać dane znaków strony kodowej 949 (koreański), użyj sortowania koreańskiego dla bazy danych. Na przykład użyj sortowania Korean_Wansung_CI_AS dla bazy danych.
Metoda 3. Użyj typu danych "binary" lub "varbinary"
Jeśli chcesz, aby baza danych przechowywała bezpośrednio i pobierała dokładne wartości bajtów znaków obsługiwanych bez próby wykonania odpowiedniego tłumaczenia strony kodowej, użyj binary typu danych lub varbinary .
Metoda 4. Używanie innego narzędzia do przechowywania i pobierania danych oraz wyłączania parametru "Auto translate"
Ostrzeżenie
Nie testujemy ani nie obsługujemy przechowywania danych znaków strony kodowej X w kolumnie strony kodowej Y. Ta operacja może spowodować językowe niepoprawne wyniki zapytania, niepoprawne dopasowywanie ciągów lub porządkowanie oraz nieoczekiwane tłumaczenie strony kodu (uszkodzenie danych). Zachęcamy do użycia jednej z innych metod obejścia tego problemu.
Jeśli używasz dostawcy microsoft OLE DB dla programu SQL Server do nawiązywania połączenia z bazą danych, która ma inną stronę kodową, i próbujesz wykonać zapytanie dotyczące danych znaków z kolumny typu danych innej niż Unicode, upewnij się, że w bazie danych są przechowywane nieprzetłumaczone znaki.
Uwaga 16.
W poniższym przykładzie przyjęto założenie, że strona kodowa komputera klienckiego to Koreański (CP949) i że strona kodowa bazy danych programu SQL Server jest angielska (CP1252). Symbole zastępcze w przykładach kodu należy zastąpić wartościami odpowiednimi dla danej sytuacji.
W celu obejścia tego problemu należy wykonać następujące czynności.
Ręcznie przekonwertuj znaki na nieprzetworzone dane, a następnie wstaw dane do bazy danych przy użyciu strony kodowej bazy danych. Aby wykonać tę operację, użyj fragmentu kodu podobnego do następującego:
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;Jeśli chcesz wykonać zapytanie dotyczące danych, użyj dostawcy Microsoft OLE DB dla programu SQL Server lub programu Microsoft .NET Framework Dostawca danych dla programu SQL Server w celu nawiązania połączenia z bazą danych, a następnie ustaw
Auto Translateparametr naFalse. Aby wykonać tę operację, użyj fragmentu kodu podobnego do następującego:OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" + " Initial Catalog =<yourdatabase>;"+ "User id=<youruserid>; Password=<yourpassword>;"+ "Auto Translate=False"); // code for representing the character data;
Więcej informacji
Aby odtworzyć problem, wykonaj następujące kroki:
Na komputerze klienckim, który ma koreański (CP949) jako domyślną stronę kod, uruchom program SQL Server Management Studio.
Połącz się z bazą danych z językiem angielskim (CP1252) jako domyślną stroną kodową.
Utwórz tabelę w bazie danych przy użyciu następującego zapytania:
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))Wstaw znak koreański do bazy danych przy użyciu następującego zapytania:
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')Utwórz zapytanie select, aby pobrać dane przy użyciu następującego zapytania:
SELECT * FROM tbTest
Otrzymasz następujące wyniki. Wartość w kolumnie A jest znakiem zapytania.
A NA Comment
-------------------- ---------- --------------------
? 가 SQLServer/INSERT