Convertir une string MSSQL en hexadécimal et annuler la valeur dans MySQL

Je veux convertir une string dans Microsoft SQL en valeur hexadécimale, par exemple:

declare @b varbinary(max) set @b = (Select cast('Ali' as varbinary)) select cast(@b as varchar(max)) select @b 

Il returnne:

C'est bien! Mais sachez que je veux unhex la string exacte dans MySQL:

Donc, dans MySQL, la string est un peu différente de la string que je reçois de MSSQL. Peut-être que je pourrais faire une string de rlocation ou quelque chose

Mais avec une string plus complexe, elle varie même entre mssql et mysql:

– Même procédure que précédemment, juste essayé une autre string: –

entrez la description de l'image ici

entrez la description de l'image ici

 MSSQL-Ssortingng: 0x53414D31302F32303130E4F6FCDF5C2A23E92D656E64657C3C6469762073 MySQL-Ssortingng: 53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E 

Le début est le même (peut-être à cause du SAM), mais il semble que ce soit un problème avec les caractères spéciaux … 🙁

Les encodings hexadécimaux SQL Server et MySQL commencent à diverger à la position 11. Le caractère à cette position est ä , le premier caractère non-ascii. Il y a donc des raisons de croire que chaque database utilise un enencoding différent.

L'enencoding MySQL est UTF-8

L'enencoding de ä en UTF-8 est 0xC3A4 , c'est ce que MySQL utilise. Ceci est confirmé par le décodeur utf-8 :

 53414D31302F32303130C3A4C3B6C3BCC39F2A23C3A92D656E --> SAM10/2010äöüß*#é-en 

La raison pour laquelle il est coupé est votre client MySQL, qui indique la coupure avec ... à la fin.

L'enencoding SQL Server est Latin1_General (alias Windows-1252)

Le encoding SQL Server de ä est 0xE4 . Il est probablement codé dans le classment Latin1_General SQL Server, qui correspond à Windows-1252 . Les autres caractères öüß convertir en 0xF6FCDF sous Windows-1252, confirmant la conjecture.

Pour forcer SQL Server à utiliser un encoding différent, spécifiez la clause d' collate :

 cast('öüß' AS varchar(5)) collate French_CS_AS 

La string hexadécimale SQL Server est coupée à cause de votre cast(... as varbinary) . Lorsque n n'est pas spécifié avec la fonction CAST, la longueur par défaut est 30 . Essayez de spécifier explicitement la taille ou définissez-la sur max :

 cast('abcd' as varbinary(max)) ^^^^^ 

Cette requête peut résoudre le but:

 Declare @b varbinary(max) Select @b=Cast(CONVERT(varbinary(4), '0x' + @HexValue, 1) As varbinary)