转换为mysqli_query()后,utf8字符错误地显示为问号

时间:2015-08-04 10:58:22

标签: php mysql utf-8 character-encoding

我的数据库是latin1_swedish_ci,但所有包含外来字符(德语,土耳其语......)的表都是utf8_general_ci。

在升级到php 5.6之前,我使用了

mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET NAMES utf8"); 

mysql_query()之前,所有内容都在我的页面中正确显示(页面标题中为<meta http-equiv="content-type" content="text/html;charset=UTF-8" />)。

将所有mysql_query(...)转换为mysqli_query(id,...)并在php 5.6下运行后,所有外语现在都被扰乱了吗?和 。切换回PHP 5.4没有帮助。 phpMyAdmin正确显示mysql数据库(未更改)。

我已经四处寻找解决方案,但没有任何作用......我错过了什么吗?

我需要更改代码才能正常工作?

3 个答案:

答案 0 :(得分:6)

一次又一次地搜索......

MAMP MySQL not recognizing my.cnf values in OSX

Does MySQL included with MAMP not include a config file?

http://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql

这是解决方案。

在我的php脚本中,我必须在连接数据库后添加一个charset查询。

$con=mysqli_connect($host",$user,$password,$db);
mysqli_set_charset($con,"utf8");

之前的字符集&amp;我用mysql_query()到php 5.4的名字已经不够了。

mysqli_query($con,"SET CHARACTER SET utf8;");
mysqli_query($con,"SET NAMES utf8");

在我的本地服务器上,添加包含以下行的my.cnf文件后,我还必须重新编译mysql:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-storage-engine = InnoDB
character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8
[mysqld_safe]
default-character-set=utf8

我还必须通过编辑MAMP / Library / share / charsets / index.xml并添加后续行来将utf8 charset添加到MAMP:

<charset name="utf8">
  <family>Unicode</family>
  <description>UTF8 Unicode</description>
  <alias>utf8</alias>
  <collation name="utf8_general_ci" id="33">
   <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="utf8_bin"        id="83">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
</charset>

在我的网络服务器上,没有必要执行上述两个步骤。

答案 1 :(得分:1)

这些乱码字符是浏览器或其他用户可见的软件包呈现utf-8字符的结果,就像它们是ASCII或Latin-1一样。

编辑在Chrome浏览器中,您可以查看浏览器呈现网页的编码。单击右上角的镶边菜单(三条小水平线)。点击更多工具&gt;点击编码&gt;然后你会看到一组字符集。尝试选择另一个。

尝试将此行放入HTML文档中。 <HEAD>部分。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这可能会强制浏览器使用正确的字符集。

END编辑

切换到mysqli后,在打开mysql会话时是否保留了SET CHARACTER SETSET NAMES查询?如果没有,请将它们放回去,看看它是否有帮助。

您的数据库可能正常工作,但PHP告诉浏览器您使用的是Latin-1。事实上,这很可能是因为phpmyadmin工作正常。

尝试执行此处建议的内容:Setting PHP default encoding to utf-8?

在字符集和排序规则方面存在很多概念混淆。当你说

  

我的数据库是latin1_swedish_ci

您的意思是新定义的表的默认字符集是latin1,默认排序规则是不区分大小写的瑞典语。这些只是默认值。数据存储的重要性在于每列使用的字符集。你说那是utf8。排序规则(utf8_general_ci)仅用于搜索和匹配。

答案 2 :(得分:0)

我遇到了同样的问题。 不确定这是否有帮助,但作为菜鸟,我无法遵循或实施此问题答案的复杂性。

首先,我将其添加到我的 html 页面中: <meta charset="utf-8"/>. 然后,我进入 PHPMyAdmin,点击我在浏览器中看到菱形问号的那一栏,然后简单地在数据库级别将编码重置为 UTF-8。

希望对你有帮助。对我来说当然很容易。

PHPMYADMIN