字符在mysql中显示为乱码(希伯来语)

时间:2016-02-06 12:41:00

标签: php mysql mysqli character-encoding

我在数据库中的charset设置为以UTF8编码的utf8_unicode_ci,所有文件(无BOM)。

这是我的php代码:

<?php
    require_once("./includes/config.php");

    $article = new Article();

    $fields = array(
        'status' => '0',
        'title' => 'מכבי ת"א אלופת אירופה בפעם ה-9',
        'shorttitle' => 'מכבי ת"א אלופת אירופה',
        'priority' => '1',
        'type' => '1',
        'category' => '2',
        'template' => '68',
        'author' => '1',
        'date' => date("Y-m-d H:i"),
        'lastupdate' => date("Y-m-d H:i"),
        'preview' => 'בלה בלה בלה',
        'content' => 'עוד קצת בלה בלה בלה',
        'tags' => 'מכבי ת"א,יורוליג,אליפות אירופה',
        'comments' => '1'
    );

    $article->set($fields);
    $article->save();

出于某种原因,希伯来字符在phpmyadmin中显示如下:

  

מ×>×'ית“×××××××××××××××××××××××××××××××××××××××

数据库连接代码:

<?php
    final class Database
    {
        protected $fields;
        protected $con;

        public function __construct($host = "", $name = "", $username = "", $password = "")
        {
            if ($host == "")
            {
                global $config;

                $this->fields = array(
                    'dbhost' => $config['Database']['host'],
                    'dbname' => $config['Database']['name'],
                    'dbusername' => $config['Database']['username'],
                    'dbpassword' => $config['Database']['password']
                );

                $this->con = new mysqli($this->fields['dbhost'], $this->fields['dbusername'], $this->fields['dbpassword'], $this->fields['dbname']);

                if ($this->con->connect_errno > 0)
                    die("<b>Database connection error:</b> ".$this->con->connect_error);
            }
            else
            {
                $this->con = new mysqli($host, $username, $password, $name);

                if ($this->con->connect_errno > 0)
                    die("<b>Database connection error:</b> ".$this->con->connect_error);
            }
        }

任何想法为什么?

2 个答案:

答案 0 :(得分:4)

您已将数据库和文件的字符集设置为UTF-8,但PHP和数据库之间的数据传输也需要正确设置。

您可以使用set_charset执行此操作:

  

设置从数据库服务器发送数据时使用的默认字符集。

添加以下内容作为数据库构造函数的最后一条语句:

$this->con->set_charset("utf8");

这不会解决数据库中已存在的数据的问题,但是对于写入数据库的新数据,您应该注意到差异。

如果您决定重建数据库,请考虑使用上级 utf8mb4 字符集,如MySql docs中所述:

  

名为 utf8 的字符集每个字符最多使用三个字节,仅包含BMP字符。从MySQL 5.5.3开始, utf8mb4 字符集每个字符最多使用四个字节,支持补充字符:

     
      
  • 对于BMP角色, utf8 utf8mb4 具有相同的存储特征:相同的代码值,相同的编码,相同的长度。

  •   
  • 对于补充字符, utf8 根本无法存储字符,而 utf8mb4 则需要四个字节来存储它。由于 utf8 根本无法存储该字符,因此您在 utf8 列中没有任何补充字符,并且在升级 utf8时无需担心转换字符或丢失数据来自旧版MySQL的数据。

  •   
     

utf8mb4 utf8

的超集

答案 1 :(得分:2)

您的整个行代码具有相同的字符集以避免字符显示不正确的问题非常重要。

有一些设置需要正确定义,我强烈推荐使用UTF-8,因为它有大多数你需要的字母(希伯来语),但也支持各种其他字符集(斯堪的纳维亚语) ,希腊语,阿拉伯语)。

这里列出了一些必须设置为特定字符集的内容。

<强>接头

将HTML和PHP标头中的字符集设置为UTF-8

  • PHP:header('Content-Type: text/html; charset=utf-8');
    (PHP标题必须放在任何类型的输出之前(echo,空格,HTML))

  • HTML:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    (HTML标题放在<head> / </head>标记内)

<强>连接

您还需要在连接本身中指定charset(在创建连接后直接放置)。

$this->con->set_charset("utf8");

数据库和表格

您的数据库及其所有表格必须设置为UTF-8。请注意,charset 与归类完全相同(请参阅this post)。

您可以通过为每个数据库和表格运行一次下面的查询(例如在phpMyAdmin中)来实现这一目标

ALTER DATABASE yourDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE yourTable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

其他

  • 某些特定函数具有特定字符集的属性,如果您使用此类函数,则应在此处指定
  • 您的数据库中可能已经有未使用UTF-8编码的值。手动更新它们可能会很麻烦,并且可能会耗费大量时间。如果是这种情况,您可以使用类似ForceUTF8的内容并循环访问数据库,使用该函数更新字段。

如果你按照上面的所有指示,你的问题很可能会得到解决。如果没有,您可以查看此StackOverflow帖子:UTF-8 all the way through