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: –
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)