sql >> Database teknologi >  >> RDS >> Sqlserver

Indkodning af SQL_Latin1_General_CP1_CI_AS til UTF-8

Jeg fandt ud af, hvordan man løser det, så forhåbentlig vil dette være nyttigt for nogen.

For det første er SQL_Latin1_General_CP1_CI_AS en mærkelig blanding af CP-1252 og UTF-8. De grundlæggende tegn er CP-1252, så derfor var det eneste, jeg skulle gøre, UTF-8, og alt fungerede. De asiatiske og andre UTF-8-tegn er kodet på 2 bytes, og php pdo_mssql-driveren synes at hade karakterer med varierende længde, så den ser ud til at lave en CAST til varchar (i stedet for nvarchar), og så bliver alle de 2 byte-tegn spørgsmålstegn (' ?').

Jeg fiksede det ved at caste det til binært og derefter genopbygge jeg teksten med php:

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

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


  1. MySQLdb og Python ImportError

  2. Datoopdeling baseret på regnskabsår

  3. PHP-formular afkrydsningsfelt og udefineret indeks

  4. Databasedesign/normaliseringsstruktur skal indeholde AND'er, OR'er, valgfrie elementer og deres relationer