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

问题描述:

我使用Python程序将包含Unicode字符的文本写入到MySQL 数据库。举个例子,其中两个字符是如何让MySQL命令行工具正确显示Unicode?

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,读取它,显示它等,没有 问题。 MySQL例外是MySQL命令行工具。当我 执行SELECT语句看到包含金星和 火星Unicode字符表中的行,这里是我在屏幕上看到:

| Venus  | ♀  | 
| Mars  | ♂  | 

我会在右列中看到的标准字形为维纳斯和 火星。

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

编辑:

我做的研究相当数量到不同的MySQL的系统变量 ,等等,我现在认识到,上面显示的my.cnf中设置有 一些严重的问题。实际上,服务器mysqld不会在显示的 设置下启动。要纠正的事情,从在[mysqld]删除这些:

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

我不知道的是,[客户]选项做任何事情,但它似乎没有 不疼。

在Python中,u'\ u2640'表示单个Unicode字符,即“♀”。这 编译到三个字节包含十六进制值E29980。我在编码和解码Unicode时都没有问题。正确的值是 被存储在MySQL表中;它们正确地从表中读取,并 当他们出现这样的Python程序显示:

♀ Venus 
♂ Mars 

程序输出可以被重定向到一个文件,通过文本编辑器, 等处理,在任何情况下都会显示正确的Unicode符号。

只有一个地方没有显示正确的Unicode符号, 这就是我使用MySQL命令行工具时的情况。当我在包含Unicode符号的表上发出 SELECT语句时,我收到上面显示的垃圾 。这不是Windows特定的问题。当我在Windows,Mac OS X, 和Ubuntu上运行MySQL命令行工具时,我的问题与 完全相同。

+0

我建议使用'HEX'函数来找出实际存储在列中的字节。 'SELECT symbol_name,HEX(symbol_bytes)FROM ...'对于以UTF8正确编码的金星unicode字符,我们期望'E29980'。 – spencer7593

Windows cmd和utf8。如果你正在谈论Windows,那么chcp 65001,加上选择正确的字体就足够了。请参阅details

Mojibake。但是,另一方面,如果您正在抱怨“Mojibake”,如♀而不是,那么请参阅中的Mojibake。当正确存储在utf8中的金星(又名女性符号)的十六进制将是E29980。如果你看到C3A2 E284A2 E282AC,你有“双重编码”,而不是简单的Mojibake。

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