4

我有一个存储在 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 代码来转换输出编码?

4

3 回答 3

4

您的问题是您的SET NAMES 'utf8_persian_ci'命令无效(utf8_persion_ci 是 collat​​ion 而不是encoding)。如果您在终端中运行它,您将看到一个错误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. 使用不变的相同字符串更新相同的行。

或者,您可以在 MySQL 中执行这些步骤,但这很棘手,因为 MySQL 将数据理解为特定字符集。您需要将文本列修改为 BLOB 类型,然后将它们修改具有 utf8 字符集的文本类型。请参阅 MySQL 文档底部ALTER TABLE标记为红色“警告”的部分。

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

最好不要使用mysql_*函数,PDO而是使用PDO dsncharset=utf8中的参数。

于 2013-01-10T14:22:29.227 回答
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
于 2013-01-10T11:51:13.953 回答
1

可能的解决方案:

  1. 将“AddDefaultCharset UTF-8”添加到您网站的 .htaccess 文件中。
  2. 添加 header('Content-Type: text/html; charset=utf-8'); 到 PHP 文件的顶部。
  3. 对需要以波斯语显示的数据使用 utf8_encode() php 函数。
于 2013-01-10T13:30:30.060 回答