批量插入包含俄语的字符串

Bulk insert string containing Russian

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

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

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

我保留了这个问题而不是将其删除,因此有人可能会发现答案有帮助。

我苦苦挣扎的原因是因为在 SQLYog 中它默认不显示字符集列。在 Alter table 视图中有一个选项显示为 "Hide language options",它将显示当 SQLyog 创建 table 时它使用默认服务器字符集,而不是您定义的 [=15] =] 字符集是。我不确定这是否正确 - 但解决方案只是打开列字符集设置并检查它们是否符合您的预期。

ПоПо 的 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.