【问题标题】:could not retrieve utf8 encoding value from mysql无法从 mysql 检索 utf8 编码值
【发布时间】:2012-07-13 09:37:16
【问题描述】:

我也有这样的问题,先看看mysql表=>

CREATE TABLE IF NOT EXISTS users(
id int(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(40) CHARSET utf8 COLLATE 'utf8_unicode_ci' NOT NULL,
surname VARCHAR(40) CHARSET utf8 COLLATE 'utf8_unicode_ci' NOT NULL,
);

它正在成功存储数据,但是当我尝试将此信息检索到我的 .php 文件(编码也是 utf8)时,它仍然显示问号(?????),为什么?我该如何解决?

更新

我做得不好的事情。所以我有 2 个 php 文件,一个是 classA.php 文件,我在其中定义了从数据库中检索信息的类,并且我已将此文件 (classA.php) 包含在我想要查看的 default.php 文件中数据。 我有上面写的完全相同的表,我正在写

header('Content-Type: text/html; charset=UTF-8');

在default.php的第一行,但是还是不行,谢谢指教:))

第二次更新

这个脚本我在 classA.php 文件中,它的编码是默认的,就像 default.php 文件编码一样。我刚刚在第一行添加了 default.php 文件

header("Content-Type: text/html; charset=UTF-8");

但还是不行。

第三次更新

sql =>

create table ok(
id int(2) not null auto_increment primary key,
name varchar(20) charset utf8 not null);

和php文件

<?php
 header('Content-Type: text/html; charset=UTF-8');
 ?>
 <!DOCTYPE html>
 <html>
 <head>
        <title>hello</title>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
     <body>


     <?php
        $con = mysqli_connect("host","user","pass","db");

       if (mysqli_connect_errno()==0){
       if ($r = mysqli_query($con,"SELECT * FROM ok")){
    mysqli_set_charset($con,"utf8");
    while ($d = mysqli_fetch_assoc($r)){
        echo $d['name'] . "<br>";
           }
           }
          }

            if (isset($con)){
               mysqli_close($con);
             }
             ?>


               </body>
               </html>

我已在 ok 表中插入 this=>

insert into ok(name) values("one"),("ერთი"),("two"),("ორი");

PS。特殊字符是格鲁吉亚语:)

它的结果是英文字符很好,格鲁吉亚人带问号:(

无论如何它都不起作用:(

【问题讨论】:

  • 你是如何检索它的,你是如何“编码为 utf8”的?
  • 我正在用 php 脚本检索它,也想发布这个脚本吗? .php 文件编码也是 utf8,当我输入外文字母时,它会保存并显示,但是当我尝试从数据库中检索时,它会显示问号
  • 你:SET CHARACTER SET utf8 SET NAMES utf8 ini_set("default_charset", "UTF-8");
  • 否,在 php.ini 中默认为:latin1
  • 看看 Nadav S. 和 Mihai Stancu 的答案

标签: php mysql utf-8


【解决方案1】:

PHP 文件采用 UTF-8 格式这一事实并不一定意味着来自/去往 数据库 的数据也采用 UTF-8 格式。

您没有提及您使用的是哪个扩展程序,但是:

  • 对于 mysql 使用 mysql_set_charset($link,'utf8');

  • 对于 mysqli 使用 mysqli-&gt;set_charset('utf8') 或与上面相同的 mysqli_

  • 对于 PDO,连接时在 DSN 字符串中包含 charset:utf8

【讨论】:

  • 不以 UTF8 形式出现并不能阻止以 UTF8 形式传输。它会阻止您对字符串执行正确的 utf8 多字节操作。
  • 我同意应该使用charset:utf8,因为它将解决以后在将数据发送到客户端/浏览器之前在PHP中处理数据时可能出现的其他问题。但这里的问题是客户端/浏览器不知道应该使用什么编码。
  • @MihaiStancu 很有趣。让我们等待提问者。
  • 我使用的是mysqli扩展,所以需要在php脚本中定义mysqli->set_charset('utf8')吗?
  • @Tornike - 在创建数据库连接后(在进行查询之前)直接设置字符集。您可以直接在 UTF-8 编码的 PHP 页面中插入 UTF-8 编码的字符串,而无需将其转换为 HTML 实体 (ა)。
【解决方案2】:

声明 HTML utf8 编码:

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

和/或在标头中传输编码:

header('Content-Type: text/html; charset=UTF-8');

【讨论】:

  • 文件可能从他的文本编辑器中保存为UTF8,这并不意味着传输编码是UTF8
  • 这个头文件应该在.php文件中,其中写入数据检索php脚本?
  • 标头应该在将数据返回给浏览器的PHP中。
  • 可以在 PHP 文件中使用 latin1 编码。只要您不在源代码中使用多字节字符,它就应该可以正常工作(即使这样它也应该可以工作,它只会在您的文本编辑器中显示错误)。
  • 最大的问题是不要将某些文件保存为 UTF8,而将其他文件保存为 latin1,尤其是不要将 Unicode UTF8 与 BOM 一起使用。因为特别是BOM和不同的编码在相互包含时可能会产生一些字符。这意味着包含 Class 文件可能会回显 BOM/其他错误解释的编码,从而使您无法使用重定向,因为该字符已发送到浏览器并且您会收到经典的“标头已发送”错误。在这种情况下,调试是一件令人恐惧的事情,因为您不知道哪个文件以不同的编码保存/包含在哪里。
【解决方案3】:

试试

htmlentities($row['name'],ENT_QUOTES);

htmlentities

【讨论】:

  • 这并不能解决问题,它会把它扫到地毯下。但是,如果您的特殊字符不在定义的实体范围之外,它就可以工作。
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 2012-09-17
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多