如何让MySQL命令行工具正确显示Unicode?

时间:2017-10-18 00:17:28

标签: mysql unicode

我使用Python程序将包含Unicode字符的文本写入MySQL 数据库。例如,两个字符是

u'\u2640' a symbol for Venus or female
u'\u2642' a symbol for Mars or male

我使用utf8mb4几乎涉及MySQL的所有字符集。这是 摘自/etc/mysql/my.cnf

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
default-character-set=utf8mb4
character-set-server =utf8mb4
character_set_system =utf8mb4

此外,所有表都是使用以下参数创建的:

ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

在所有方面,除了一个,Unicode的处理工作得很好。我可以 将Unicode写入数据库表,读取它,显示它等等 问题。 MySQL命令行工具mysql是个例外。当我 执行SELECT语句以查看包含Venus和的表中的行 火星Unicode字符,这是我在屏幕上看到的:

| Venus     | ♀      |
| Mars      | ♂      |

我在右栏中应该看到的是金星和金星的标准字形 火星

有关如何让MySQL命令行工具显示Unicode的任何想法 正常?

编辑:

我已经对各种MySQL系统进行了大量的研究 变量等,我现在意识到上面显示的my.cnf设置有 一些严重的问题。事实上,服务器mysqld将无法启动 设置显示。要纠正错误,请从[mysqld]中删除它们:

default-character-set=utf8mb4
character-set-system=utf8mb4

我不确定[client]选项是否有效,但似乎没有 伤。

在Python中,'u 2640'表示单个Unicode字符,即“♀”。这个 编译为包含十六进制值E29980的三个字节。我有 所有编码和解码Unicode都没有问题。正确的值是 存储在MySQL表中;从表中正确读取它们,并且 当它们由Python程序显示时,它们会显示如下:

♀   Venus
♂   Mars

程序输出可以重定向到文件,由文本编辑器处理, 等等,并且在所有情况下都会显示正确的Unicode符号。

只有一个地方没有显示正确的Unicode符号, 那就是我使用MySQL命令行工具的时候。当我发出一个 包含Unicode符号的表上的SELECT语句我得到了垃圾 如上所示。这不是Windows特定的问题。我完全一样 我在Windows,Mac OS X上运行它时,MySQL命令行工具的问题, 和Ubuntu。

3 个答案:

答案 0 :(得分:0)

Windows cmd和utf8。如果您在谈论Windows,那么docker exec -it <container id> sh,加上选择正确的字体就足够了。请参阅details

Mojibake。但是,另一方面,如果你抱怨“Mojibake”,例如chcp 65001而不是♀,那么请参阅{{3}中的Mojibake }。当正确存储在中时,维纳斯(又名女性符号)的十六进制将为utf8。如果你看到E29980,就会有“双重编码”,而不仅仅是“Mojibake”。

不要在MySQL的任何地方使用C3A2 E284A2 E282AC

答案 1 :(得分:0)

我在使用 mysql 命令行程序查询 Wordpress 时遇到了同样的问题。使用 --default-character-set=utf8mb4 选项时,您可以看到正确输出到终端的字符。

例如

$ mysql --default-character-set=utf8mb4 -D my_database -e "SELECT option_value FROM wp_options WHERE option_name = 'myoption'"

如果您想为用户配置此项,只需编辑 ~/.my.cnf 并将以下内容添加到 [client] 部分:

[client]
default-character-set = utf8mb4

这样一切都对我们有用。

答案 2 :(得分:0)

我有点尴尬地报告说从来没有出现过问题 显示 Unicode 字符的 MySQL 命令行工具。为什么我认为 有吗?

我使用 MySQLdb 编写了许多 Python 2 程序来与 MySQL。我的数据涉及 Unicode 字符,例如 Mars 和 金星。我能够将这些 Unicode 字符写入数据库,读取 它们返回,并且通常像任何其他字符一样对它们进行操作。

有一个烦恼:使用 MySQL 命令行工具,当我选择 包含火星和金星等符号的表格中的行,我只看到了垃圾。 这就是让我看到我的原始帖子的原因,该帖子询问我如何将 Unicode 转换为 正确显示。我从来没有得到满意的答复。

最近我开始使用 pymysql 将 Python 2 程序转换为 Python 3 与 MySQL 通信。立刻,我遇到了问题。统一码 我从数据库中读取的字符似乎全错了。调查 表明,实际上,存储在数据库中的字节(用 Python 创建 2) 没有为我使用的 Unicode 字符形成正确的 utf8 序列 使用。

我将创建表格的 Python 2 程序转换为 Python 3, 重新创建了表格,并且,presto,changeo,一切正常。其他 词,数据库中的字符从第一天起就错了,但是读取时 通过 Python 2 程序,重新创建了原始的 Unicode 字符 正确。

当然,突然之间,MySQL 命令行工具开始显示 Unicode 字符就好了。问题是 由 Python 2 和 MySQLdb 创建的数据库不正确 utf8 我存储的字符的表示。我不知道到底是什么 字节是,我处理这个问题的时间太长了 试图找出答案。

对于在 MySQL 中使用 Unicode 的任何人,我推荐this 文章。 它显示了必须为 Unicode 设置的所有 MySQL 参数,并且 展示了如何在自己的 MySQL 安装中查看参数。