2015-05-16 21 views
8

In un progetto su cui sto lavorando i miei dati sono archiviati in SQL Server, con la fascicolazione Danish_Norwegian_CI_AS. I dati vengono inviati tramite FreeTDS e ODBC, a python che gestisce i dati come UTF-8. Alcuni dei personaggi, come å, ø e æ, non vengono codificati correttamente, causando l'arresto del progetto.È possibile che SQL Server converta regole di confronto in UTF-8/UTF-16

Ho passato un paio d'ore a leggere sul mondo confuso di codifiche, fascicolazione e code-page, e mi sento come se avessi capito meglio l'intera immagine.

Alcuni degli articoli che ho letto, mi fanno pensare che sarebbe possibile: Specificare nell'istruzione di selezione SQL, che i dati di confronto debbano essere codificati in UTF-8 quando viene emesso.

Il motivo per cui penso sia possibile è this article che mostra un esempio di come arrivare ai tavoli, con regole di confronto diverse, per giocare bene insieme.

Tutti i puntatori nella direzione della conversione di regole di confronto in UTF-8/UTF-16, sarebbero molto apprezzati!

EDIT: Ho letto che SQL Server fornisce un'opzione unicode attraverso nchar, nvarchar e ntext, e che le altre variabili stringa char, varchar e text sono codificati secondo attivare la fascicolazione. Ho anche letto che le opzioni unicode sopra menzionate sono codificate nella variante utf-16 ucs-2 (spero di ricordarmelo bene). Così; per consentire tabelle di regole di confronto e unicode, per giocare bene, dovrebbe esserci una funzione di conversione, no?

+0

con un problema simile utilizzando mySQL e jdbc, questo ha risolto il mio problema. creando le tabelle usando 'create table a (.....) DEFAULT CHARSET = utf8;' e connettendosi al database usando ''" jdbc: mysql: // localhost/testDb? useUnicode = true & characterEncoding = UTF-8 ";' quindi presumo ci debba essere un modo con MS SQL sever –

+0

@SkarosIlias Grazie per il vostro contributo. Sfortunatamente la tabella è già stata creata e popolata, quindi non è un'opzione per me. – Rookie

+0

fare un tentativo con una nuova tabella e inserire alcuni dati di test solo per assicurarsi che questo funzioni. se fa un 'alter table' –

risposta

10

4 mesi dopo, ho finalmente trovato la risposta al mio problema. Si è scoperto che non aveva nulla a che fare con il driver FreeTDS o con le regole di confronto:

Era la funzione di connessione di pyodbc, che apparentemente richiede un flag; unicode_results=True

Pubblicato qui per aiutare altri sfortunati soules condannati a vagare senza meta nel buio, alla ricerca di un indizio.

3

Sembra che SQL non supporta UTF-8 (vedi here), ma si può provare a cambiare le regole di confronto nel selezionare come:

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS 
from Data 

È possibile anche a nudo gli accenti utilizzo di questa soluzione: How to remove accents and all chars <> a..z in sql-server?

Un'altra soluzione potrebbe essere trasmetti il ​​tuo colonna nvarchar

SELECT cast (Account as nvarchar) as NewAccount 
from Data 

cui account è varchar sul tuo iniziale t grado.

Se per esempio si tenta:

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

il risultato finale sarà "T"

+0

'CAST()' ha funzionato! Grazie per questo. – Ivan