Est-il possible d'avoir SQL Server convertir le classment en UTF-8 / UTF-16

Dans un projet sur Danish_Norwegian_CI_AS je travaille, mes données sont stockées dans SQL Server, avec le classment Danish_Norwegian_CI_AS . Les données sont sorties via FreeTDS et ODBC, vers python qui gère datatables comme UTF-8. Certains caractères, tels que å, ø et æ, ne sont pas codés correctement, ce qui entraîne une interruption du projet.

J'ai passé quelques heures à lire sur le monde confus des enencodings, de la collation et des pages de codes, et j'ai l'printing d'avoir mieux compris l'set de l'image.

Certains des articles que j'ai lus me font penser qu'il serait possible de: Spécifier dans l'instruction SQL select, que datatables de classment devraient être encodées en UTF-8 quand elles sont éditées.

La raison pour laquelle je pense que c'est possible est cet article qui montre un exemple de la façon d'arriver à des tables, avec des collations différentes, pour jouer sympa set.

Tous les pointeurs dans le sens de la conversion de classment en UTF-8 / UTF-16, seraient grandement appréciés!

EDIT: J'ai lu que SQL Server fournit une option unicode via nchar , nvarchar et ntext , et que les autres variables de string char , varchar et text sont codées en fonction de l'assemblage. J'ai également lu que les options unicode mentionnées ci-dessus sont codées en utcs-16 variante ucs-2 (J'espère que je me souviens de ce droit). Alors; afin de permettre des tables de locale et de collation unicode, pour jouer sympa, il devrait y avoir une fonction de conversion, non?

4 mois plus tard, j'ai finalement trouvé la réponse à mon problème. Il s'avère que cela n'avait rien à voir avec le pilote FreeTDS, ou le classment de la database:

C'était la fonction connect de pyodbc, qui nécessite apparemment un drapeau; unicode_results=True

Publié ici pour aider d'autres âmes malheureuses condamnées à errer sans but dans l'obscurité, à la search d'un indice.

Il semble que SQL ne supporte pas UTF-8 (voir ici ) mais vous pouvez essayer de changer le classment dans le select comme:

 SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS from Data 

Vous pouvez également supprimer les accents en utilisant cette solution: Comment supprimer les accents et tous les caractères <> a..z dans sql-server?

Une autre solution pourrait être de lancer votre colonne à nvarchar

 SELECT cast (Account as nvarchar) as NewAccount from Data 

où Account est varchar sur votre table initiale.

Si par exemple vous essayez:

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

le résultat final sera "ţ"