【问题标题】:how to deal with accents and strange characters in a database?如何处理数据库中的重音和奇怪字符?
【发布时间】:2016-01-18 03:04:15
【问题描述】:

我试图在我的数据库中保护带有口音的西班牙语单词,但它不起作用,我已经尝试过:

1) 将排序规则从表和行更改为 utf8_spanish_ciutf_unicode_ci.

2) 用

添加标题标签
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

3)添加

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

在一个 php 标签中。

在我笔记本电脑的 xampp 服务器中执行此操作可以,但是当我将数据库上传到登录怪物服务器时,它不会正确保存口音。

编辑:这是我使用的连接:

    private function Connect()
    {
        //$this->settings = parse_ini_file("settings.ini.php");
        try 
        {
            # Read settings from INI file, set UTF8
            $this->pdo = new PDO('mysql:host=localhost;dbname=xxxxx;charset=utf8', 'xxxxx', 'xxxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

            # We can now log any exceptions on Fatal error. 
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            # Disable emulation of prepared statements, use REAL prepared statements instead.
            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

            # Connection succeeded, set the boolean to true.
            $this->bConnected = true;
        }
        catch (PDOException $e) 
        {
            # Write into log
            echo $this->ExceptionLog($e->getMessage());
            die();
        }
    }

编辑:

我无法保存重音,它显示为奇怪的字符,如 á = á

【问题讨论】:

  • 将数据库排序规则更改为utf8_general_ci,并将元内容类型设置为text/html; charset=utf-8
  • @Philipp Collat​​ion 对存储数据的字符集没有影响。 Collat​​ion 仅影响排序。此外,他已经在使用您建议他的元内容类型。
  • UTF-8 all the way through 的可能重复项,但我不会将其标记为接近投票,因为看起来您到目前为止所做的一切都是正确的。无论如何都值得一读
  • 远程服务器上运行的是什么版本的 PHP?
  • 那你解决了吗?还要检查您的数据是否没有损坏(请参阅我的答案中的注释)。

标签: php mysql database utf-8


【解决方案1】:

排序规则只影响文本排序,对存储数据的实际字符集没有影响。

我会推荐这种配置:

  1. 仅为整个数据库设置字符集,因此您不必为每个表单独设置它。字符集从数据库继承到表到列。使用utf8 作为字符集。

  2. 设置数据库连接的字符集。连接到数据库后执行这些查询:

    SET CHARACTER SET 'utf8'
    SET NAMES 'utf8'
    
  3. 设置页面的字符集,使用 HTTP 标头和/或 HTML 元标记。其中之一就足够了。使用utf-8 作为charset

这应该足够了。

如果您想对西班牙语字符串进行正确排序,请为整个数据库设置 collat​​ionutf8_spanish_ci 应该可以工作(ci 表示不区分大小写)。如果没有适当的排序规则,带重音的西班牙字符将始终排在最后。

注意:有可能是您在表格中已有的数据字符集已损坏,因为您之前的字符集配置错误。您应该首先使用一些数据库客户端检查它以排除这种情况。如果它损坏了,只需使用正确的字符集配置重新插入您的数据。

character set 如何在数据库中工作

  • objects 有一个 character set 属性,可以显式设置或继承(服务器 > 数据库 > 表 > 列),所以最好的选择是为整个数据库

  • client connection 还有一个 character set 属性,它告诉数据库您发送数据的编码方式

如果客户端连接的字符集和目标对象的字符集不同,您发送到数据库的数据会自动从连接的字符集转换为对象的字符集。

因此,例如,如果您有 utf8 中的数据,但 客户端连接 设置为 latin1,数据库将破坏数据,因为它会尝试转换 utf8 之类的这是latin1

【讨论】:

  • 已经做了 1 和 3。这就是我的 pdo 连接方式。 $this->pdo = new PDO('mysql:host=localhost;dbname=xxxx;charset=utf8', 'xxxxx', 'xxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));还是不行
  • 请在连接到数据库后立即从第 2 项执行两个查询,就像执行任何其他查询一样。如果还是不行,我们可以尝试查找原因。
  • 我正在执行两个查询,也许我错了,但我在另一篇文章中看到使用 'mysql:host=localhost;dbname=xxxxx;charset=utf8' 设置字符集并且我已经在使用数组(PDO: :MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
  • 还有如何检查表数据是否损坏?
  • @2one2 -- SELECT col, HEX(col) FROM tbl WHERE ... 如果 col 有 á,对于 utf8(或 utf8mb4),HEX(col) 应该有 C3A1
【解决方案2】:

这是我存储 UTF8 字符的清单。不过,请务必将失败的原因与您将字符串存储到数据库中的部分隔离开来——这意味着要存储的字符串仍然是用户输入时的状态。

首先。确保使用的 table 的字符集是 utf8 或更好,但使用 utf8mb4 以获得完整的 unicode 支持(尽管它有其缺点也)。为整个数据库设置了哪个字符集并不重要;如果指定,它会被表定义覆盖。创建此类表的 DDL 代码如下:

CREATE TABLE table_name (
    id INT AUTO_INCREMENT NOT NULL,
    name VARCHAR(190) NOT NULL,
    date_created DATETIME NOT NULL,
    PRIMARY KEY(id)
)
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ENGINE = InnoDB;

其次。使用utf8 字符集进行数据库连接。

// This should be enough
new PDO(
    'mysql:host=localhost;dbname=xxxxx;charset=utf8mb4;',
    'username',
    'password'
);

【讨论】:

  • 我只是建议你为整个数据库设置一个字符集,这样你就不必为每个表单独设置它(可能会忘记为某些表设置它)。跨度>
  • 好建议,我同意你的看法;事实上,我就是这样做的。尽管在实践中,即使为整个数据库设置了合理的默认值,我仍然倾向于显式设置表的字符集。这迫使您真正考虑您尝试存储在表中的数据(即使用什么字符集),并且还有助于避免“意外”使用错误的字符集。
  • 尽管使用了 utf8mb4 并在第一个 PDO() 参数中设置了 charset=utf8mb4,但我还是遇到了变音符号问题。
【解决方案3】:

对于 MySql 调用数据库连接后使用这些代码:

$set_utf=$dbh->exec("SET NAMES UTF8"); 

【讨论】:

    【解决方案4】:

    我必须存储大量来自不同语言(包括法语和西班牙语)的重音字母,而我目前发现的唯一安全方法是将所有内容存储在 MySQL 中的 utf8_bin 中,并且像你一样以字符集 utf-8 显示页面。 无需进一步处理,无论是来自 MySQL 还是来自 PHP。

    另外,请确保您的 IDE 以 utf8 格式管理您的文件。

    【讨论】:

    • 我没用ide,我用记事本,有没有办法用记事本管理?
    • 如果你在谈论 Notepad++(如果不是,你应该看看 notepad-plus-plus.org ),有专门的菜单来管理文件编码。我不能给你菜单的名字,我的 np++ 是法语,但它相当于“编码”。
    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2015-08-27
    • 2010-12-27
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多