MySQL Server 安装後的字符集设置

MySQL 支持非常多的字符编码方式,但配置不当,程序乱码也很头疼。

Ubuntu

在 Ubuntu 上通过 apt 安装的 MySQL,在安装过程中没有字符集设置的步骤,这就需要在安装後补上,否则会出现恼人的乱码问题,中文数据全变成问号了。

具体设置方法如下:

在 /etc/mysql/my.cnf 文件中的[client]段和 [mysqld]段添加以下两行黑体内容:

[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8

以上设置针对5.1.3以前的版本有效,5.1.3之後,则需要添加下面的内容:

[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
#character-set-client-handshake = FALSE
character-set-server = utf8
collation-server = utf8_general_ci

OK,重启一下数据库(/etc/init.d/mysql restart)。再来看一下系统的支持的编码:

mysql> show variables like 'character%';

以上指令执行後,发现 character_set_database 的字符集还不是 utf8,可以执行下面的命令:

mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.22 sec)

注:这种方法其实是有去瑕疵的,只是在当前会话有效,退出登录或者重启 mysql 或重启系统後,就失效了,根本的解决方法还是改配置文件。

对 character_set_database 可以在创建数据库时设置,或创建好了修改,参 tinyhare 在 stackoverflow 的回复,相关指令如下:

# change the database/table charset:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
#set when create database/table:
CREATE DATABASE new_db CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE TABLE new_table (id INT) CHARSET utf8 COLLATE utf8_general_ci;

RHEL

RedHat 的配置和 Debian 系稍微有些不一样,哥开始也头疼了一会。後来在按照 http://guichina.blog.51cto.com/2001125/724939(by guichina) 修改成功,记录如下:

  • OS: Red Hat 4.1.2-46
  • mysql: Ver 14.14 Distrib 5.5.28

具体设置步骤如下:

1. /etc/my.cnf 默认是少配置的,需要手工复制过来:

cp /usr/share/mysql/my-large.cnf /etc/my.cnf

2. 编辑 my.cnf ,

在 [client] 下添加:

default-character-set=utf8

在 [mysqld] 下添加:

character-set-server=utf8

注,原文建议是三行:

     default-storage-engine=INNODB
     character-set-server=utf8
     collation-server=utf8_general_ci

3. 设置完成後,重启生效

    /sbin/service mysql restart

其他

单独设置某个数据库:

    alter database testdb character set utf8;

查看mysql支持的编码:

    show character set;

一般可用下面两条命令查看编码支持情况:

show variables like 'character_%';
show variables like 'collation_%';

参考

  1. 【转】 Ubuntu下MySQL中文乱码解决 zz
  2. MySQL查询出现乱码解决方案
  3. How to properly setup MySQL 5.7 for production on Ubuntu 16.04
  4. How to set character_set_database and collation_database to utf8 in my.ini?