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

时间:2015-12-02 17:04:54

标签: php mysql pdo utf-8 sqlyog

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

但是,如果我将其编译成一个字符串(在该过程中只涉及addslashes)并将其插入表中,我会看到很多????。我将表字符集设置为utf8mb4,并将整理设置为utf8mb4_general_ci。我还运行$ this-> db-> query(“SET NAMES'utf8mb4'”);在我的数据库连接上。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

ПоПо的Mojibake。大概...

  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是SET NAMES latin1,但应该是这样。

问号暗示......

  • 你有utf8编码的数据(好)
  • CHARACTER SET latin1生效(默认,但错误)
  • 该列已声明SELECT col, HEX(col) FROM tbl WHERE ... (默认,但错误)

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

По

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