1

我正在开发一个在 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 社区服务器 (GPL)。

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

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

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

4

3 回答 3

3

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

因此,对于两个系统之间的任何接口,都需要一个规范来说明编码字符串的含义。对于 MySQL,这就是 API 调用mysql_set_charset。这是告诉 MySQL PHP 发送给它的编码字符串的方式,以及 MySQL 应该将字符串返回给 PHP 的方式。如果不明确设置,则假定某些默认编码,这可能与您期望的编码不同,从而产生不匹配和垃圾字符。

阅读每个程序员绝对、积极需要了解的关于编码和字符集的知识,以便在 Web 应用程序中处理文本从前到后处理 Unicode ,以获取更多信息。

于 2013-08-12T10:20:18.270 回答
2

建立连接后始终调用它是明智的,以确保您的应用程序不会受到服务器设置损坏的影响。因为你可以让你的表在 ie UTF8 中并以 UTF8 发送你的数据,但如果连接不是 UTF8(因为 iemy.ini设置),那么你最终会一团糟。因此,无论是调用mysql_set_charset()还是执行SET NAMES charset查询,您都将处于安全状态。而且由于每次连接都执行一次,因此基本上没有成本操作

于 2013-08-12T10:14:17.603 回答
1

mysql_set_charset函数设置当前连接的默认字符集。即使您的数据以 unicode 存储在服务器上,它仍然需要兼容的连接字符集才能准确传输数据。

如果您SHOW VARIABLES LIKE 'character\_set\_%'在 mysql 中执行语句,它将显示服务器和当前连接使用的各种字符集。理想情况下,它们都应该匹配并且是utf8.

更多信息:MySQL 连接字符集

于 2013-08-12T10:24:25.590 回答