web-dev-qa-db-fra.com

Est-il possible que SQL Server convertisse le classement en UTF-8 / UTF-16

Dans un projet sur lequel je travaille, mes données sont stockées dans SQL Server, avec le classement Danish_Norwegian_CI_AS. Les données sont sorties via FreeTDS et ODBC, vers python qui gère les données en UTF-8. Certains des caractères, comme å, ø et æ, ne sont pas codés correctement, provoquant l'avancement du projet jusqu'à Grind s'est arrêté.

J'ai passé quelques heures à lire sur le monde déroutant des encodages, du classement et des pages de codes, et j'ai l'impression d'avoir une meilleure compréhension de l'image entière.

Certains des articles que j'ai lus me font penser qu'il serait possible de: Spécifier dans l'instruction SQL select, que les données de classement doivent être encodées en UTF-8 lors de leur sortie.

La raison pour laquelle je pense que c'est possible est cet article qui montre un exemple de comment se rendre à des tables, avec différents classements, pour jouer à Nice ensemble.

Tous les pointeurs dans le sens de convertir le classement 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 chaîne char, varchar et text sont codés selon le classement défini. J'ai également lu que les options unicode mentionnées ci-dessus sont codées dans la variante utf-16 ucs-2 (j'espère que je m'en souviens bien). Donc; afin de permettre aux tables de classement local et unicode, pour jouer à Nice, il devrait y avoir une fonction de conversion, non?

11
Rookie

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

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

Publié ici pour aider d'autres âmes malheureuses vouées à errer sans but dans le noir, à la recherche d'un indice.

12
Rookie

Il semble que SQL ne supporte pas UTF-8 (voir ici ) mais vous pouvez essayer de changer le classement dans la sélection comme:

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS
from Data

Vous pouvez également supprimer les accents à l'aide de cette solution: Comment supprimer les accents et tous les caractères <> a..z dans sql-server?

Une autre solution pourrait être de convertir votre colonne en 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 "ţ"

3
sbiz