Почему я получаю недопустимые символы при преобразовании данных MS SQL в MYSQL?

Я пишу PHP-скрипт для импорта данных в базу данных MYSQL из базы данных Microsoft SQL Server 2008.

сервер MSSQL устанавливается с параметрами сортировки "SQL_Latin1_General_CP1_CI_AS", и данные, о которых идет речь, хранятся в столбце типа"nchar".

мои веб-страницы PHP используют

<meta http-equiv="content-type" content="text/html; charset=utf-8">

чтобы указать, что они должны отображаться с кодировкой символов UTF-8.

я извлекаю данные из базы данных MSSQL, используя расширение PHP sqlsrv.

$sql = 'SELECT * FROM [tArticle] WHERE [ID] = 6429';
$stmt = &sqlsrv_query($dbHandler, $sql);

while ($row = sqlsrv_fetch_object($stmt)) {
  // examples of what I've tried simply to display the data
  echo $row->Text1;
  echo utf8_encode($row->Text1);
  echo iconv("ISO-8859-1", "UTF-8", $row->Text1);
  echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $row->Text1);
}

забудьте о вставке данных в базу данных MYSQL на данный момент. Я не могу заставить строку правильно отображаться на моей странице PHP. Из примеров в моем списке:

echo $row->Text1

отображается моим браузером как явно недопустимый символ:"Lucy�s"

все примеры, следующие за этим, отображаются как пробелы:"Lucys"

Это похоже на проблему несоответствия набора символов для меня, но как я могу получить эти данные правильно отображать из базы данных MS SQL (без изменения моей кодировки веб-страницы)? Если я смогу понять это, я, вероятно, смогу разработать его хранение в части базы данных MYSQL.

2 ответов


если строки в исходной базе данных закодированы в UTF-8, вы должны использовать utf8_decode, а не utf8_encode.

но они, вероятно, закодированы на каком-то латинском или "западном" кодовая страница Windows. Поэтому я бы попробовал iconv("CP1252", "UTF-8", $row->Text1);, например.

Другой альтернативой является запуск SQL-запроса, который явно задает известную кодировку. Например, согласно имя параметров сортировки Windows (Transact-SQL) документация, этот запрос будет использовать кодовую страницу 1252 для кодирования поле Текст1: SELECT Text1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM ....


попробуйте эту команду, она работает для меня:

$connectionInfo = array( "Database"=>"DBName", "CharacterSet" =>"UTF-8");