是否使用utf8 - MySQL和PHP字符编码问题

时间:2013-01-10 11:20:06

标签: php mysql character-encoding

我在MySQL中存储了一个字符串,如下所示:یکی از Ø我的表格的字符集为utf8,排序规则为utf8_general_ci

当我从MySQL检索字符串时,浏览器会显示如下:یکی از بهترین راه并且没关系(它是波斯语)。

注意:

  • 连接后我使用了mysql_query("SET NAMES 'utf8_persian_ci'"); 到MySQL。

  • 我将<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />标记放在每页的标题中。

现在,我需要使用mysql_query("SET NAMES 'utf8'");

但在使用它之后,浏览器会显示如下字符串:یکی از Ø(与存储在MySQL中的字符串相同)。

如何更改MySQL存储记录并解决问题?或者使用一些PHP代码来转换输出编码?

3 个答案:

答案 0 :(得分:4)

您的问题是SET NAMES 'utf8_persian_ci'命令无效(utf8_persion_ci是归类,而不是编码)。如果您在终端中运行它,您将看到错误Unknown character set: 'utf8_persian_ci'。因此,当应用程序存储数据时,您的应用程序正在使用latin1字符集。 MySQL将您的输入解释为latin1字符,然后将其存储为utf-8。同样,当数据被撤回时,MySQL将它从UTF-8转换回latin1并且(希望大部分时间)将你给它的原始字节转换成。

换句话说,数据库中的所有数据都已完全搞砸了,但它恰好正常工作。

要解决此问题,您需要撤消所做的操作。最直接的方法是使用PHP:

  1. SET NAMES latin1;
  2. 从每个表中选择每个文本字段。
  3. SET NAMES utf8;
  4. 使用相同的字符串更新相同的行。
  5. 或者你可以在MySQL中执行这些步骤,但它很棘手,因为MySQL理解数据是在某个字符集中。您需要将文本列修改为BLOB类型,然后将它们 back 修改为具有utf8字符集的文本类型。请参阅ALTER TABLE MySQL documentation labeled "Warning" in red底部的部分。

    执行上述任一操作后,存储在数据库列中的字节将是他们声称的实际字符集。然后,确保您始终在PHP的任何数据库访问中使用mysql_set_charset('utf8') ,以后可能会这样做!否则你会再次搞砸了。 (注意,不要使用简单的mysql_query('SET NAMES utf8')有一些极端情况(例如重置连接),可以在您不知情的情况下将其重置为latin1。{{1必要时会设置charset。)

    最好不要使用mysql_set_charset()功能,而是使用mysql_*代替PDO dsn中的PDO参数。

答案 1 :(得分:1)

您可能需要更改Charset和Collat​​ion列。

尝试执行此查询:

ALTER TABLE  `YOUR_TABLE_NAME` CHANGE  `YOUR_COLUMN_NAME`  `YOUR_COLUMN_NAME` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL

(在示例中,我假设VARCHAR具有DEFAULT NULL VALUE)

如果这对您有用,那么您可以在my.conf文件中插入以下代码,使utf8成为默认字符集:

default-character-set   = utf8

答案 2 :(得分:1)

可能的解决方案:

  1. 将“AddDefaultCharset UTF-8”添加到您网站的.htaccess文件中。
  2. 添加标题('Content-Type:text / html; charset = utf-8');到你的PHP文件的顶部。
  3. 对需要在波斯语中显示的数据使用utf8_encode()php函数。