2010-05-01 180 views
1

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

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

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

所以,更一般地说:MS SQL Server数据库中有一个Unicode字符串,它通过ODBC通过ODBC检索。然后它被放入SQL数据库执行的SQL插入查询(作为utf-8 varchar列的值)。

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

我使用:PHP 5.2.5,MySQL5.0.45社区-NT,MS SQL Server 2005的

PHP必须在Linux的平台上运行。

UPDATE:,当我在这个字符串调用函数utf8_encode($ S)和在MySQL中使用插入查询该值,但随后插入的字符串不mysql数据库中正确显示(这样就不会发生错误utf8编码仅用于执行正确的utf8字符串,但它丢失了正确的字符)。

+0

您仅限于使用odbc,或者您是否可以安装/使用sqlsrv扩展? http://msdn.microsoft.com/en-us/library/cc296152%28SQL.90%29.aspx它允许您(轻松地)指定连接的字符集。 – VolkerK 2010-05-01 14:58:19

+0

该解决方案必须在Linux上运行,并且不幸在此平台上不支持您提及的扩展。 – JohnM2 2010-05-01 15:04:31

+0

MySQL!= MSSQL。 – 2010-05-01 23:53:20

回答

1

也许你可以使用PDO extension,如果它有什么区别?

有一个用户贡献评论here,建议将sql server中的数据类型更改为somethig其他,如果这是不可能的看看投掷字段的用户类。

1

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

你确定PHP和MySQL服务器使用UTF8进行通信吗?直到PHP 6的Unicode支持往往是这样恼人的不一致。

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

从您的描述中,听起来像PHP将连接视为仅用于ASCII。

4

首先你有DB的编码。然后你有ODBC客户端使用的编码。

如果您的ODBC客户端连接的编码与数据库的编码不匹配,则在某些情况下,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

希望这会有所帮助。