1

我使用 ODBC 从 PHP 连接到 SQL Server。在 PHP 中,我从 SQL Server 读取了一些字符串(nvarchar 列)数据,然后想将其插入 mysql 数据库。当我尝试将这样的值插入 mysql 数据库表时,我得到了这个 mysql 错误:

Incorrect string value: '\xB3\xB9ow...' for column 'name' at row 1

对于所有 ASCII 字符的字符串,一切都很好,当存在非 ASCII 字符(来自某些欧洲语言)时,就会出现问题。

因此,更笼统地说:MS SQL Server 数据库中有一个 Unicode 字符串,由 PHP 通过 ODBC 检索。然后将其放入为 mysql 数据库执行的 sql 插入查询(作为 utf-8 varchar 列的值)中。

有人可以向我解释在这种情况下在编码方面发生了什么吗?在哪一步可能发生什么字符编码转换?

我使用:PHP 5.2.5、MySQL5.0.45-community-nt、MS Sql Server 2005。

PHP 必须在Linux平台上运行。

更新:当我在这个字符串上调用 utf8_encode($s) 并在 mysql 插入查询中使用该值时,错误不会发生,但是插入的字符串在 mysql 数据库中无法正确显示(因此 utf8 编码仅适用于执行正确的 utf8 字符串,但它会丢失正确的字符)。

4

3 回答 3

4

首先你有数据库的编码。然后您就有了 ODBC 客户端使用的编码。

如果您的 ODBC 客户端连接的编码与 DB 的编码不匹配,在某些情况下,ODBC 层会自动对您的数据进行转码。

这里的技巧是强制对 ODBC 客户端连接进行编码。

对于“全 UTF-8”设置:

$conn=odbc_connect(DB_DSN,DB_USR,DB_PWD);
odbc_exec($conn, "SET NAMES 'UTF8'");
odbc_exec($conn, "SET client_encoding='UTF-8'");

// processing here

这与 PostgreSQL + Php 5.x 完美配合。确切的语法和选项取决于数据库供应商。

您可以在这里找到非常有用且清晰的 MySql 附加信息:http: //dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

希望这可以帮助。

于 2011-09-05T13:00:13.723 回答
1

也许你可以使用PDO 扩展,如果它会有所作为?

这里有一个用户贡献的评论,建议将 sql server 中的数据类型更改为其他类型,如果这不可能,请查看转换字段的用户类。

于 2010-05-01T16:58:07.060 回答
1

我没有通过 PHP 使用 ODBC 的经验,但是对于 mysql 函数,PHP 似乎默认为 ASCII,如果你想避免麻烦,需要明确 UTF8 连接。

您确定 PHP 和 MySQL 服务器使用 UTF8 进行通信吗?在 PHP 6 之前,Unicode 支持往往会像那样令人讨厌地不一致。

我记得 MySQL 文档提到了一个连接字符串参数来调整 Unicode 编码。

根据您的描述,听起来 PHP 将连接视为仅 ASCII。

于 2010-05-01T23:57:18.813 回答