大容量插入包含俄语的字符串


Bulk insert string containing Russian

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

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

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

我保留了这个问题,而不是删除它,这样有人可能会发现答案很有用。

我之所以感到困难,是因为在SQLYog中,默认情况下它不会显示Charset列。Alter表视图上有一个选项,上面写着"隐藏语言选项",然后会显示当SQLyog创建表时,它使用默认的服务器Charset,而不是你定义的表Charset。我不确定这是否正确,但解决方案只是打开列Charset设置,并检查它们是否符合你的期望。

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