Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Encodage SQL_Latin1_General_CP1_CI_AS en UTF-8

J'ai trouvé comment le résoudre, alors j'espère que cela sera utile à quelqu'un.

Tout d'abord, SQL_Latin1_General_CP1_CI_AS est un étrange mélange de CP-1252 et UTF-8. Les caractères de base sont CP-1252, c'est pourquoi tout ce que j'avais à faire était UTF-8 et tout fonctionnait. Les caractères asiatiques et autres caractères UTF-8 sont encodés sur 2 octets et le pilote php pdo_mssql semble détester les caractères de longueur variable, il semble donc faire un CAST vers varchar (au lieu de nvarchar) puis tous les caractères de 2 octets deviennent des points d'interrogation (' ?').

Je l'ai corrigé en le convertissant en binaire, puis je reconstruis le texte avec php :

SELECT CAST(MY_COLUMN AS VARBINARY(MAX)) FROM MY_TABLE;

En php :

//Binary to hexadecimal
$hex = bin2hex($bin);

//And then from hex to string
$str = "";
for ($i=0;$i<strlen($hex) -1;$i+=2)
{
    $str .= chr(hexdec($hex[$i].$hex[$i+1]));
}
//And then from UCS-2LE/SQL_Latin1_General_CP1_CI_AS (that's the column format in the DB) to UTF-8
$str = iconv('UCS-2LE', 'UTF-8', $str);