Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Mã hóa SQL_Latin1_General_CP1_CI_AS thành UTF-8

Tôi đã tìm thấy cách giải quyết nó, vì vậy hy vọng điều này sẽ hữu ích cho ai đó.

Đầu tiên, SQL_Latin1_General_CP1_CI_AS là sự kết hợp kỳ lạ giữa CP-1252 và UTF-8. Các ký tự cơ bản là CP-1252, vì vậy đây là lý do tại sao tất cả những gì tôi phải làm là UTF-8 và mọi thứ đều hoạt động. Châu Á và các ký tự UTF-8 khác được mã hóa trên 2 byte và trình điều khiển php pdo_mssql dường như không thích các ký tự có độ dài khác nhau, vì vậy nó dường như thực hiện CAST thành varchar (thay vì nvarchar) và sau đó tất cả các ký tự 2 byte trở thành dấu chấm hỏi (' ? ').

Tôi đã sửa nó bằng cách truyền nó sang nhị phân và sau đó tôi xây dựng lại văn bản bằng php:

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

Trong 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. Làm cách nào để tính toán tương đương với SQL Server (băm ('SHA1', [ColumnName])) trong C #?

  2. cách ghi số vào hàm word trong máy chủ sql

  3. Ngày xây dựng từ năm và số tuần trong MSSQL

  4. máy chủ sql chọn hàng đầu tiên từ một nhóm

  5. Ghi lại nhiều thông báo lỗi từ một câu lệnh duy nhất bên trong TRY CATCH