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