sql >> Database >  >> RDS >> Sqlserver

SQL_Latin1_General_CP1_CI_AS coderen in UTF-8

Ik heb gevonden hoe ik het kan oplossen, dus hopelijk kan iemand hier iets aan hebben.

Ten eerste is SQL_Latin1_General_CP1_CI_AS een vreemde mix van CP-1252 en UTF-8. De basistekens zijn CP-1252, dus daarom hoefde ik alleen UTF-8 te doen en alles werkte. De Aziatische en andere UTF-8-tekens zijn gecodeerd op 2 bytes en het php pdo_mssql-stuurprogramma lijkt tekens van verschillende lengtes te haten, dus het lijkt een CAST te doen naar varchar (in plaats van nvarchar) en dan worden alle tekens van 2 bytes vraagtekens (' ?').

Ik heb het opgelost door het naar binair te casten en daarna heb ik de tekst opnieuw opgebouwd met php:

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


  1. Gegevens weergeven in een RecyclerView

  2. Hoe krijg ik RANDOM-records van elke categorie in MySQL?

  3. Tabellen repliceren uit verschillende databases van dezelfde mysql-server

  4. Update databasetabel met selectievakjes, php &mysql