【问题标题】:Bulk insert string containing Russian批量插入包含俄语的字符串
【发布时间】:2015-12-02 17:04:53
【问题描述】:

我正在使用 PHPExcel 将电子表格转换为数据库,并且单元格值恰好包含俄语。如果我运行 mb_detect_encoding(),我会被告知文本是 UTF8,如果我设置了 UTF8 标题,那么我会看到正确的俄语字符。

但是,如果我将它编译成一个字符串(过程中只包含斜杠)并将其插入到表中,我会看到很多 ????。我已将表字符集设置为 utf8mb4,并将排序规则设置为 utf8mb4_general_ci。我还运行了 $this->db->query("SET NAMES 'utf8mb4'");在我的数据库连接上。

我使用我的多部分插入运行 PDO query() 并获得 ???s 但如果我将查询输出到屏幕我会得到 ÐŸÐ¾Ñ 这将是有效的 UTF8。为什么这不能正确存储在数据库中?

【问题讨论】:

    标签: php mysql pdo utf-8 sqlyog


    【解决方案1】:

    我保留了这个问题,而不是删除它,所以有人可能会觉得这个答案很有帮助。

    我苦苦挣扎的原因是因为在 SQLYog 默认情况下它不会向您显示 Charset 列。在 Alter 表视图中有一个读取“隐藏语言选项”的选项,它将显示当 SQLyog 创建表时,它使用默认服务器字符集,而不是您定义的表字符集。我不确定这是否正确 - 但解决方案只是打开列字符集设置并检查它们是否符合您的预期。

    【讨论】:

      【解决方案2】:

      ПоПо 的 Mojibake。大概……

      • 客户端中的字节已正确编码为 utf8(良好)。
      • 您可能默认连接到SET NAMES latin1(或set_charset('latin1') 或...)。 (应该是utf8。)
      • 表格中的列可能是CHARACTER SET utf8,也可能不是,但应该是这样。

      问号表示...

      • 你有 utf8 编码的数据(好)
      • SET NAMES latin1 生效(默认,但错误)
      • 该列被声明为CHARACTER SET latin1(默认,但错误)

      帮助诊断问题的一种方法是运行

      SELECT col, HEX(col) FROM tbl WHERE ...
      

      对于По,十六进制应为D09FD0BE。 utf8 中的每个西里尔字符都是十六进制 D0xx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-03
        • 2022-06-15
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 2011-05-30
        • 2010-09-14
        • 1970-01-01
        相关资源
        最近更新 更多