【问题标题】:Everything after a Greek letter is empty in my database在我的数据库中,希腊字母之后的所有内容都是空的
【发布时间】:2019-10-16 17:45:14
【问题描述】:

我遇到了我确定是编码错误,但我似乎无法在我的逻辑中找到薄弱环节。特别是,当尝试将希腊 lambda 插入我的数据库时,该 lambda 之后的单元格是空白的。

过程:

在打印任何 html 之前,我正在做:

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

接下来,我正在使用 PDO 进行连接:

$dsn = 'mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'] . ';charset=utf8';
 $options = array(
            PDO::ATTR_EMULATE_PREPARES => false, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );
        try {
            $dbh = new PDO($dsn, $config['username'], $config['password'], $options);
            $dbh->exec("SET NAMES utf8");
            $dbh->exec("SET FOREIGN_KEY_CHECKS = 1");

当我这样做时

显示来自 my_table 的完整列

我可以看到排序规则是 utf8_general_ci。 当我这样做时:

echo mb_detect_encoding($data_to_be_entered);

我得到了 UTF-8

当我在将 $data_to_be_entered 插入数据库之前将其回显到控制台时,我看到:(????=23)

但是,在我的数据库中,我只看到 ( 作为条目。

【问题讨论】:

标签: php mysql pdo encoding character-encoding


【解决方案1】:

那个 lambda ? 是数学符号。它以 UTF-8 编码为 4 个字节的十六进制 F09D9C86。因此,它需要 MySQL CHARACTER SET utf8mb4,而不是 utf8。

如果您想要希腊语 lambda λ,则可以使用 CHARACTER SET utf8(或 utf8mb4)。它的十六进制是CEBB。

【讨论】:

  • 你为什么重新打开这个问题? dupe 说的完全一样。
  • @YourCommonSense - (1) 截断和 Mojibake 是不同原因的不同问题。 (2) 引起麻烦的不是希腊字母,而是数学符号。 (3) 这需要utf8mb4;其他人需要其他解决方案。
  • @YourCommonSense - 而且...多年来我一直在为 UTF-8 问题苦苦挣扎;花了很长时间才意识到问题至少有 5 种不同的原因,至少有 4 种不同的可见症状,以及至少 6 种不同的解决方法。使用错误的修复(因为误诊,或者因为假设它是一个精确的重复)会对用户造成伤害。
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多