Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kodowanie SQL_Latin1_General_CP1_CI_AS do UTF-8

Znalazłem sposób na rozwiązanie tego problemu, więc mam nadzieję, że komuś się to przyda.

Po pierwsze, SQL_Latin1_General_CP1_CI_AS to dziwna mieszanka CP-1252 i UTF-8. Podstawowymi znakami są CP-1252, więc dlatego wszystko, co musiałem zrobić, to UTF-8 i wszystko działało. Znaki azjatyckie i inne znaki UTF-8 są zakodowane na 2 bajtach, a sterownik php pdo_mssql wydaje się nienawidzić znaków o różnej długości, więc wydaje się, że wykonuje CAST na varchar (zamiast nvarchar), a następnie wszystkie 2-bajtowe znaki stają się znakami zapytania (' ?').

Naprawiłem to, rzutując go na plik binarny, a następnie przebudowałem tekst za pomocą php:

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

W 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. Jak oddzielić (podzielić) ciąg znaków przecinkiem w procedurze składowanej SQL Server

  2. Zapytanie o relację rodzic-dziecko do najwyższego poziomu

  3. Jak mogę zmienić ograniczenie klucza podstawowego za pomocą składni SQL?

  4. Jak odszyfrować hasło z serwera SQL?

  5. SQL Server:Baza danych utknęła w stanie przywracania