首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使MySQL命令行工具正确显示Unicode?

问如何使MySQL命令行工具正确显示Unicode?
EN

Stack Overflow用户
提问于 2017-10-18 00:17:28
回答 3查看 2.6K关注 0票数 1

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

代码语言:javascript
复制
u'\u2640' a symbol for Venus or female
u'\u2642' a symbol for Mars or male

我对涉及到utf8mb4的几乎所有字符集都使用MySQL。以下是/etc/mysql/my.cnf的摘录

代码语言:javascript
复制
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

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

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

代码语言:javascript
复制
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

在所有方面,除了一个方面,Unicode的处理都很好。我可以写Unicode到数据库表,读取它,显示它,等等,没有任何问题。例外是mysql,MySQL命令行工具。当我执行SELECT语句来查看包含金星和火星Unicode字符的表中的行时,下面是我在屏幕上看到的内容:

代码语言:javascript
复制
| Venus     | ♀      |
| Mars      | ♂      |

我应该在右边的栏中看到的是金星和火星的标准符号。

对于如何使MySQL命令行工具正确显示Unicode,有什么想法吗?

编辑:

我对各种MySQL系统变量等做了大量的研究,现在我意识到上面显示的my.cnf设置有一些严重的问题。实际上,mysqld服务器不会使用所示的设置启动。要纠正问题,请从mysqld中删除这些内容。

代码语言:javascript
复制
default-character-set=utf8mb4
character-set-system=utf8mb4

我不确定客户的选择能做些什么,但似乎没什么坏处。

在Python‘\u2640’中,表示单个Unicode字符,即"♀“。这将编译到包含十六进制值E29980的三个字节。我完全没有编码和解码Unicode的问题。正确的值存储在MySQL表中;它们从表中正确读取,当被Python程序显示时,它们显示如下:

代码语言:javascript
复制
♀   Venus
♂   Mars

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

只有一个地方没有显示正确的Unicode符号,那就是当我使用MySQL命令行工具时。当我在包含Unicode符号的表上发出SELECT语句时,我会得到上面显示的垃圾。这不是Windows特有的问题。在Windows、Mac和Ubuntu上运行MySQL命令行工具时,我也遇到了同样的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-07 23:52:48

我有点尴尬地报告,显示Unicode字符的MySQL命令行工具从来没有问题。为什么我觉得有?

我编写了许多使用MySQLdb与MySQL通信的Python2程序。我的数据涉及Unicode字符,例如火星和金星的符号。我能够将这些Unicode字符写到数据库中,并将它们读取回来,并且,一般来说,我可以像任何其他字符一样对它们进行操作。

有一个烦恼:使用MySQL命令行工具,当我从包含火星和金星等符号的表中SELECTed行时,我只看到垃圾。这就是我最初发帖的原因,我问如何才能让Unicode正常显示。我从来没有得到令人满意的答案。

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

我将创建表的Python 2程序转换为Python 3,重新创建了表,然后,presto,changeo,所有操作都正常。换句话说,数据库中的字符从第一天起就出错了,但是当被Python 2程序读取时,原始Unicode字符就被正确地重新创建了。

当然,突然间,MySQL命令行工具开始显示Unicode字符。问题是由Python2和MySQLdb创建的数据库中的字节不是我要存储的字符的正确的utf8表示。我不知道确切的字节是什么,我已经处理这个问题太长时间,花时间试图找出。

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

票数 1
EN

Stack Overflow用户

发布于 2017-10-18 01:12:53

Windows和utf8. --如果您指的是Windows,那么是chcp 65001,加上选择正确的字体就足够了。见http://mysql.rjweb.org/doc.php/charcoll#entering_accents_in_cmd。

Mojibake .,但是,另一方面,如果你抱怨的是"Mojibake“,比如♀而不是♀,那么请看https://stackoverflow.com/questions/38363566/trouble-with-utf-8-characters-what-i-see-is-not-what-i-stored中的Mojibake。金星的妖术(也就是女性星座),当正确地储存在utf8中时,将是E29980。如果您看到C3A2 E284A2 E282AC,您有“双重编码”,而不仅仅是Mojibake。

不要在u'\u2640'中的任何地方使用MySQL。

票数 2
EN

Stack Overflow用户

发布于 2020-12-29 20:41:46

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

,例如

代码语言:javascript
复制
$ mysql --default-character-set=utf8mb4 -D my_database -e "SELECT option_value FROM wp_options WHERE option_name = 'myoption'"

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

代码语言:javascript
复制
[client]
default-character-set = utf8mb4

对我们来说一切都是这样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46801020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档