sql >> Databáze >  >> RDS >> Sqlserver

Kódování SQL_Latin1_General_CP1_CI_AS do UTF-8

Našel jsem, jak to vyřešit, tak snad to někomu pomůže.

Za prvé, SQL_Latin1_General_CP1_CI_AS je zvláštní mix CP-1252 a UTF-8. Základní znaky jsou CP-1252, takže proto jsem musel udělat jen UTF-8 a vše fungovalo. Asijské a další znaky UTF-8 jsou kódovány na 2 bajtech a zdá se, že ovladač php pdo_mssql nesnáší různě dlouhé znaky, takže se zdá, že provádí CAST na varchar (místo nvarchar) a poté se všechny 2bajtové znaky stanou otazníky (' ?').

Opravil jsem to přetypováním na binární a poté jsem text znovu sestavil pomocí php:

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

V 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. Jak mohu na serveru SQL určit, zda se rozsah dateTime překrývá s jiným

  2. SQL, Manipulace s prázdnými buňkami

  3. Jak přistupovat k dilematu:export objednávek ze starého magento systému import do nového magenta, překrývající se ID

  4. Funkce TO_DATE() v Oracle