我正在使用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
。