sql >> Databasteknik >  >> RDS >> Sqlserver

Kodar SQL_Latin1_General_CP1_CI_AS till UTF-8

Jag hittade hur man löser det, så förhoppningsvis kan det här vara till hjälp för någon.

För det första är SQL_Latin1_General_CP1_CI_AS en konstig blandning av CP-1252 och UTF-8. De grundläggande tecknen är CP-1252, så det var därför allt jag behövde göra var UTF-8 och allt fungerade. De asiatiska och andra UTF-8-tecknen är kodade på 2 byte och php pdo_mssql-drivrutinen verkar hata tecken med varierande längd så det verkar göra en CAST till varchar (istället för nvarchar) och sedan blir alla 2 byte-tecken frågetecken (' ?').

Jag fixade det genom att casta det till binärt och sedan byggde jag om texten 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. Hur man automatiskt återförfrågar med LoaderManager

  2. Fråga med brutet underval bör resultera i fel men returnerar rader

  3. Utlösa syntax och OM ANNAT DÅ

  4. PDO-fel:SQLSTATE[HY000]:Allmänt fel:2031