批量插入包含俄语的字符串
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
.
我正在将使用 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
.