代码之家  ›  专栏  ›  技术社区  ›  Dinko Pehar

使用PHP从MySQL读取克罗地亚字母时有问题吗?[复制品]

  •  0
  • Dinko Pehar  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我正在用php和mysql建立一个小网站。

    从数据库读取时出现问题。我可以在数据库上执行所有操作,但是当我 SELECT 从数据库中,我得到一些字符无效或表示错误。

    我得到:

    Koriste?我是KimimalalISTI?库普里?你是说我是罗马人,我是普雷多?我是斯沃·斯洛?/enost u odnosu pojedinca prema postoje?我是扎科尼玛。

    但在数据库中我看到:

    Koriste_i kriminalisti_ku pri_u dostojevski je sastavio roman kojim je predo_i o svu slo_

    问题在于克罗地亚字母: Č Ć Ž Đ Å . 我想问题出在 collation 数据库的

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   dearsina    6 年前

    非英语字符是一个头痛的问题,但在过去的几年里,处理它们变得更容易了。首先,确保数据库中的varchar和文本列排序规则设置为 utf8mb4_unicode_ci .

    然后,您需要确保在查询数据库时,使用的是utf8。在从PHP连接到MySQL服务器之后,但在运行任何其他查询之前,请运行以下查询:

    SET NAMES utf8mb4;
    

    最后,确保显示文本的页面也已准备好UTF8。现在大多数浏览器都是默认的,但为了安全起见,在HTML标题中设置以下标记:

    <meta charset="utf-8">
    

    如果您正在使用mysqli,下面的代码片段可能会有所帮助:

    # Set up the mysqli driver
    $driver = new mysqli_driver();
    
    # Report all errors
    $driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR;
    
    # Try connecting
    try {
        $mysqli = new mysqli($_ENV['db_servername'],$_ENV['db_username'], $_ENV['db_password'], $_ENV['db_database']);
    }
    catch(mysqli_sql_exception $e) {
        if ($mysqli->connect_error) {
            die("[Error #{$mysqli->connect_errno}] {$mysqli->connect_error}");
        } else {
            die($e->getMessage());
        }
    }
    
    # Ensure everything is UTF8mb4
    $mysqli->set_charset('utf8mb4');
    
    # Ensure PHP and mySQL time zones are in sync
    $offset = (new \DateTime())->format("P");
    $mysqli->query("SET time_zone='$offset';");