《复仇者联盟4:终局之战》队长退休。开始之前
这里还有一个mysql字符乱码的例子,部署redmine过程中,mysql数据库使用了默认的字符集,导致含有中文内容为乱码。
解决这个问题有两种方法:
一、参考《为什么Docker创建的mysql容器字符乱码?》这篇文章,重来一遍并选择正确的字符集。
二、修改配置文件设置utf8字符集,对已经存在的数据,使用alter语句修改数据表的字符集。
这里采用第二种方式,不过数据库内的数据表较多,我们使用shell脚本批量完成这个工作。
环境描述
redmine 需要 php mysql 运行环境 (LNMP)
mysql版本: mysql-5.6php版本: 5.6redmine: 2.6database.yml 编码为 encoding: utf8操作步骤
1. 配置文件
# 写入转换字符集的表名,每行一个。cat tables.txtattachments workflows # 省略….
2. shell脚本
如果你不清楚 alter 语句使用方法,请参考《运维常用 mysql 语句》”修改表的字符集”的示例。
3. 执行脚本
bash -x convert_mysql_charset.sh
MySql 字符集
mysql 对于字符集的设置有四个层次:
服务器(server)
数据库(database)
数据表(table)
连接(connection)。
1. 字符集规则
默认的配置包括以下:
1)编译,指定了一个默认的字符集,默认字符集是latin1。
2)安装,可以在配置文件my.cnf中指定一个默认的的字符集,如果没指定这个值则继承编译时指定的。
3)启动 mysqld,可以在命令行参数中指定一个默认的的字符集,如果没指定这个值继承自配置文件中的配置, 此时 character_set_server 被设定为这个默认的字符集。
4)创建数据库,除非明确指定,否则数据库的字符集被缺省设定为 character_set_server 。
5)选定数据库,character_set_database 被设定为这个数据库默认的字符集。
6)创建一张表,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集。
7)添加字段,除非明确指定,否则缺省的字符集就是表默认的字符集;
2. 查看默认字符集默认情况下,mysql的字符集是 latin1。
mysql> show variables like ‘%char%’; ————————– —————————- | Variable_name | Value | ————————– —————————- | character_set_client | latin1 || character_set_connection | latin1 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | latin1 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ | ————————– —————————- 8 rows in set (0.01 sec)#mysql> show variables like ‘%collation%’; ———————- ——————- | Variable_name | Value | ———————- ——————- | collation_connection | latin1_swedish_ci || collation_database | latin1_swedish_ci || collation_server | latin1_swedish_ci | ———————- ——————- 3 rows in set (0.00 sec)
3. 修改默认字符集
最简单的修改方法,就是修改mysql的配置文件(my.cnf)中的字符集
cat /etc/my.cnf# 其它配置项省略…default-character-set = utf8character_set_server = utf8# 修改完后,重启mysql的服务。/etc/init.d/mysqld restart
参考文章
《mysql编译安装脚本》
《Redmine Garbled》
小结
最后来总结下文章中的知识点
默认情况下,mysql的字符集是 latin1,为了解决乱码问题请使用utf8。
对于已经保存在mysql数据库的数据,可以使用shell脚本 alter语句批量更改字符集。