Я однажды решил эту проблему, проблема в том, что драйвер PHP mssql не работает (не может найти ссылку на bugs.php.net, но он есть) и завершается ошибкой, когда дело доходит до полей nchar и nvarchar и utf8. Вам нужно будет немного преобразовать данные и запросы:
SELECT some_nvarchar_field FROM some_table
Во-первых, вам нужно изменить вывод на двоичный - чтобы он не испортился:
SELECT CONVERT(varbinary(MAX), some_nvarchar_field) FROM some_table;
Затем в PHP вам нужно преобразовать его обратно в UTF-8, там вам понадобится iconv extension
iconv('UTF-16LE', 'UTF-8', $result['some_nvarchar_field']);
Это исправляет выбор данных из базы данных, однако, если вы действительно хотите поместить некоторые данные в базу данных или добавить предложение WHERE
, вы все равно будете получать ошибки, поэтому исправление для WHERE
, UPDATE
, INSERT
и т. Д. Путем преобразования строки в шестнадцатеричную форму:
Представьте, что у вас есть этот запрос:
INSERT INTO some_table (some_nvarchar_field) VALUES ('ŽČŘĚÝÁÖ');
Теперь нам нужно запустить PHP:
$value = 'ŽČŘĚÝÁÖ';
$value = iconv('UTF-8', 'UTF-16LE', $value); //convert into native encoding
$value = bin2hex($value); //convert into hexadecimal
$query = 'INSERT INTO some_table (some_nvarchar_field) VALUES(CONVERT(nvarchar(MAX), 0x'.$value.'))';
Запрос становится таким:
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));
И это будет работать !
Я проверил это на MS SQL Server 2008 в Linux, используя FreeTDS, и он отлично работает, у меня есть несколько огромных веб-сайтов, работающих без проблем.