我使用ODBC从
PHP连接到sql Server.
在PHP中,我从sql Server读取了一些字符串(nvarchar列)数据,然后将其插入到MysqL数据库中.当我尝试将这样的值插入MysqL数据库表时,我得到了这个MysqL错误:
在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检索.然后将它放入sql insert查询(作为utf-8 varchar列的值),这是为MysqL数据库执行的.
有人可以向我解释在这种情况下编码方面发生了什么吗?在哪一步可以进行字符编码转换?
我使用:PHP 5.2.5,MysqL5.0.45-community-nt,MS sql Server 2005.
PHP必须在Linux平台上运行.
更新:当我在此字符串上调用utf8_encode($s)并在MysqL插入查询中使用该值时,不会发生错误,但插入的字符串在MysqL数据库中无法正确显示(因此utf8编码仅适用于强制执行正确的utf8字符串,但它丢失了正确的字符).
首先,您拥有数据库的编码.然后,您具有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
希望这可以帮助.