2015-05-16 4 views
8

W projekcie pracuję nad danymi są przechowywane w SQL Server, z sortowaniem Danish_Norwegian_CI_AS. Dane są wysyłane przez FreeTDS i ODBC, do Pythona, który obsługuje dane jako UTF-8. Niektóre postacie, takie jak å, ø i æ, nie są poprawnie kodowane, co powoduje, że postępy projektu zostają zatrzymane.Czy możliwe jest sortowanie konwersji SQL Server do UTF-8/UTF-16

Spędziłem kilka godzin czytając o zagmatwanym świecie kodowania, zestawiania i stron kodowych i poczułem się, jakbym lepiej zrozumiał cały obraz.

Niektóre artykuły, które przeczytałem, pozwala mi sądzić, że można: W instrukcji SQL select określić, że dane o sortowaniu powinny być zakodowane do UTF-8, gdy są wyprowadzane.

Powodem, dla którego myślę, że to możliwe, jest this article, który pokazuje przykład, jak dostać się do stołów, z różnymi sortowaniami, aby dobrze grać razem.

Wszelkie wskaźniki w kierunku konwersji sortowania na UTF-8/UTF-16, byłyby bardzo mile widziane!

EDIT: Przeczytałem, że SQL Server udostępnia opcję Unicode przez nchar, nvarchar i ntext, i że pozostałe zmienne łańcuchowe char, varchar i text są kodowane zgodnie ustawić sortowanie. Przeczytałem również, że wyżej wymienione opcje Unicode są kodowane w wariancie utcs-16 ucs-2 (mam nadzieję, że pamiętam to dobrze). Więc; w celu umożliwienia tabelom sortowania locale i unicode, aby grać ładnie, powinna istnieć funkcja konwersji, nie?

+0

mając podobny problem z użyciem mySQL i jdbc, to rozwiązało mój problem. tworzenie tabel przy użyciu 'create table a (.....) DEFAULT CHARSET = utf8;' i łączenia się z bazą danych za pomocą '' "jdbc: mysql: // localhost/testDb? useUnicode = true & characterEncoding = UTF-8"; ' więc zakładam, że musi istnieć sposób z serwerem MS SQL sever –

+0

@SkarosIlias Dziękujemy za twój wkład. Niestety, tabela jest już utworzona i wypełniona, więc nie jest to opcja dla mnie. – Rookie

+0

spróbuj z nową tabelą i wstaw niektóre dane testowe, aby upewnić się, że to działa. jeśli robi to 'alter table' –

Odpowiedz

10

4 miesiącach, w końcu znalazłem odpowiedzi na mój problem. Okazuje się, że nie miało to nic wspólnego ze sterownikiem FreeTDS ani ze zbieraniem bazy danych:

To była funkcja połączenia pyodbc, która najwyraźniej wymaga flagi; unicode_results=True

Zamieszczone tutaj, aby pomóc innym nieszczęsnym soułom skazanym na błądzenie bez celu po ciemku, szukając wskazówek.

3

Wydaje się, że SQL nie obsługuje UTF-8 (patrz here), ale można spróbować zmienić sortowanie w select jak:

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS 
from Data 

Można też rozebrać akcenty korzystania z tego rozwiązania: How to remove accents and all chars <> a..z in sql-server?

Innym rozwiązaniem mogłoby być oddawania kolumnę nvarchar

SELECT cast (Account as nvarchar) as NewAccount 
from Data 

gdzie konto jest varchar na swojej początkowej t zdolny.

Jeśli na przykład spróbować:

SELECT cast(cast(N'ţ' as varchar) as nvarchar) 

końcowy wynik będzie „T”

+0

'CAST()' działało! Dziękuję Ci za to. – Ivan