php - 为什么在将 MS SQL 数据转换为 MYSQL 时会出现无效字符?

标签 php sql-server character-encoding

我正在编写 PHP 脚本以将数据从 Microsoft SQL Server 2008 数据库导入 MYSQL 数据库。

MSSQL 服务器设置了排序规则“SQL_Latin1_General_CP1_CI_AS”,相关数据存储在“nchar”类型的列中。

我的 PHP 网页使用

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

表示它们应该以 UTF-8 字符编码显示。

我正在使用 sqlsrv PHP 扩展从 MSSQL 数据库中提取数据。

$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 数据库部分的问题。

最佳答案

如果源数据库中的字符串是UTF-8编码的,你应该使用utf8_decode,而不是utf8_encode

但它们可能以某种拉丁语或“西方”编码Windows code page .例如,我会尝试 iconv("CP1252", "UTF-8", $row->Text1);

另一种方法是运行一个明确设置已知编码的 SQL 查询。例如,根据 Windows Collation Name (Transact-SQL)文档中,此查询将使用代码页 1252 对字段 Text1 进行编码:SELECT Text1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM ...

关于php - 为什么在将 MS SQL 数据转换为 MYSQL 时会出现无效字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4663325/

相关文章:

php - 使用 Doctrine DQL 插入带有 DateTime 的 mysql 行

php - MS SQL try catch 在被 php mssql_query 执行时被忽略

C#:将 byte[] 转换为 UTF8 编码的字符串

php - 如何在外部/独立的PHP文件(Wordpress外部)中调用Wordpress代码段

php - WordPress - 实时更新数据库值。

php - 通过 sendgrid 发送的电子邮件未送达

sql - 将行拆分为多行

sql-server - 在 Toad/SQL Navigator 中生成 "Create Table"脚本

python - 如何使用Python在Windows下删除文件名中的无效字符

php - mysql, php - 字符编码问题`