Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Codierung von SQL_Latin1_General_CP1_CI_AS in UTF-8

Ich habe herausgefunden, wie man es löst, also wird dies hoffentlich für jemanden hilfreich sein.

Erstens ist SQL_Latin1_General_CP1_CI_AS eine seltsame Mischung aus CP-1252 und UTF-8. Die Grundzeichen sind CP-1252, daher musste ich nur UTF-8 verwenden und alles funktionierte. Die asiatischen und anderen UTF-8-Zeichen sind auf 2 Bytes codiert und der PHP-pdo_mssql-Treiber scheint Zeichen unterschiedlicher Länge zu hassen, sodass er anscheinend einen CAST für varchar (anstelle von nvarchar) ausführt, und dann werden alle 2-Byte-Zeichen zu Fragezeichen (' ?').

Ich habe es behoben, indem ich es in eine Binärdatei umgewandelt habe, und dann habe ich den Text mit php:

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

In 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);