Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Кодиране на SQL_Latin1_General_CP1_CI_AS в UTF-8

Намерих как да го реша, така че се надявам, че това ще бъде полезно за някого.

Първо, SQL_Latin1_General_CP1_CI_AS е странна комбинация от CP-1252 и UTF-8. Основните символи са CP-1252, така че това е причината, поради която трябваше да направя само UTF-8 и всичко работеше. Азиатските и други UTF-8 символи са кодирани в 2 байта и драйверът на php pdo_mssql изглежда мрази символи с различна дължина, така че изглежда прави CAST към varchar (вместо nvarchar) и след това всички 2-байтови знаци стават въпросителни (' ?').

Поправих го, като го прехвърлих в двоичен файл и след това възстанових текста с php:

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

В 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OBJECTPROPERTY() срещу OBJECTPROPERTYEX() в SQL Server:Каква е разликата?

  2. Как да обвържа ISO8601 TSQL параметър DATETIME с PDO?

  3. Мога ли да накарам SQL Server да извиква съхранена процедура на всеки n секунди?

  4. Изявлението е прекратено. Максималната рекурсия 100 е изчерпана преди завършването на оператора

  5. SQL Server Profiler - Как да филтрирам проследяване, за да показвам само събития от една база данни?