php - 什么时候需要显式调用mysql_set_charset?

标签 php mysql

我正在 Linux 服务器上使用 MySQL 数据库开发网站。

使用 phpMyAdmin,在数据库上,它说

  • MyISAM 是此 MySQL 服务器上的默认存储引擎
  • latin1_swedish_ci

但是,我已经使用 InnoDB 和 utf8_unicode_ci 创建了所有表。我还检查了所有表的表字段是否为 utf8_unicode_ci。

然而,当我使用 mysql_fetch_array 并回显到流时,它给出了乱码。我必须显式设置 mysql_set_charset('utf8') 以使文本正确显示。

PHP版本为5.3.9; MySQL 版本为 5.1.70-cll - MySQL Community Server (GPL)。

这是我第一次遇到这个问题,之前我从来没有设置过字符集。

是什么导致 php mysql_* 获取的文本乱码?什么情况下需要mysql_set_charset

编辑:这不是吸引建议使用替代库的问题,例如mysqli,pdo。我只想了解有关 MySQL 和字符集行为的当前情况。谢谢。

最佳答案

当在两个系统之间交换数据时,总会有一个问题“发送文本的编码是什么?”“文本”简单地表示为二进制数据,即由 1 和 0 组成的长串。这些可能意味着任何事情。有数百种编码方案可以将不同的字符编码为不同的 1 和 0 序列。如果系统只是接收到一串字符串而没有被告知它们代表什么编码,则系统无法知道这些字符应该是什么。

因此,对于两个系统之间的任何接口(interface),都需要指定编码字符串所在的规范。对于 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 TextHandling Unicode Front To Back In A Web App获取更多信息。

关于php - 什么时候需要显式调用mysql_set_charset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18184408/

相关文章:

php - 上传图像而不损失质量

php - 搜索字母数字字符串

PHP 数组内存消耗

MySQL触发器增加/减少其他表中的值

php - 如何使用单个 Laravel 代码实例配置和运行具有各自数据库的多个网站

mysql - 将旧版 MySQL 脚本转换为 Postgres 9.5

PHP MYSQL 深度查询

php - Javascript 缩小自动化

mysql - 使用另一个表的 MAX 值连接表

php - 显示具体编号每页行数?