我正在一个Linux服务器上使用MySQL数据库的网站上工作。
在数据库上使用phpMyAdmin,它说
但是,我已经使用InnoDB和utf8_unicode_ci创建了所有表。我还检查了所有表的表字段是utf8_unicode_ci。
然而,当我使用mysql_fetch_array和echo来流时,它会给出乱码。我必须明确设置mysql_set_charset('utf8')
才能使文本正确显示。
PHP版本是5.3.9; MySQL版本是5.1.70-cll - MySQL社区服务器(GPL)。
这是我第一次遇到这个问题而且之前从未设置过charset。
是什么导致php mysql_ *获取的文本被乱码?在什么情况下需要mysql_set_charset
?
编辑:这不是吸引使用替代库的建议的问题,例如: mysqli,pdo。我只想了解当前关于MySQL和charsets行为的观点。感谢。
答案 0 :(得分:3)
当在两个系统之间交换数据时,总会出现问题“将文本发送到什么编码?”“Text”简单地表示为二进制数据,只是长串1和0。这些可能意味着什么。有数百种编码方案可以将不同的字符编码为1和0的不同序列。如果系统只接收到一串字符串而没有被告知它们代表什么编码,系统就无法知道那些字符应该是什么字符。
因此,对于两个系统之间的任何接口,需要有一个编码字符串所在的规范。对于MySQL,这就是API调用mysql_set_charset
。这是告诉MySQL PHP发送给它的编码字符串的方式,以及MySQL应该将字符串返回给PHP的代码。如果没有明确设置,则默认编码为假定,这可能与您期望的编码不同,从而产生不匹配和乱码。
阅读What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text和Handling Unicode Front To Back In A Web App了解详情。
答案 1 :(得分:2)
建立连接后始终调用它是明智的,以确保您的应用程序不会受到服务器设置损坏的影响。因为您可以使用UTF8中的表格并以UTF8格式发送数据,但如果连接不是UTF8(因为my.ini
设置),那么您最终会陷入混乱。因此,请致电mysql_set_charset()
或执行SET NAMES charset
查询,您将处于安全的境地。而且由于每次连接都会完成一次,所以基本上没有成本操作
答案 2 :(得分:1)
mysql_set_charset
个函数设置当前连接的默认字符集。即使您的数据存储在服务器上的unicode中,它仍然需要兼容的连接字符集才能准确传输数据。
如果在mysql中执行SHOW VARIABLES LIKE 'character\_set\_%'
语句,它将显示服务器和当前连接使用的各种字符集。理想情况下,他们都应匹配并成为utf8
。