我在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代码来转换输出编码?
答案 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:
SET NAMES latin1;
SET NAMES utf8;
或者你可以在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和Collation列。
尝试执行此查询:
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)
可能的解决方案: