这里还有一个mysql
字符乱码的例子,部署redmine
过程中,mysql
数据库使用了默认的字符集,导致含有中文内容为乱码。
解决这个问题有两种方法:
一、参考《为什么Docker创建的mysql容器字符乱码?》这篇文章,重来一遍并选择正确的字符集。
二、修改配置文件设置utf8
字符集,对已经存在的数据,使用alter
语句修改数据表的字符集。
这里采用第二种方式,不过数据库内的数据表较多,我们使用shell脚本批量完成这个工作。
redmine
需要 php + mysql
运行环境 (LNMP)
mysql版本: mysql-5.6
php版本: 5.6
redmine: 2.6
database.yml 编码为 encoding: utf8
1. 配置文件
# 写入转换字符集的表名,每行一个。
cat tables.txt
attachments
workflows
# 省略....
2. shell脚本
cat convert_mysql_charset.sh
#!/bin/bash
# name : convert_mysql_charset.sh
# dongnan <@微信公众号:运维录>
# database
db_name=mydb
echo "database: ${db_name}" && sleep 5
# loop
while read table_name;do
echo "table: $table_name"
mysql -hMySql-Server -uroot -p \
-e "alter table ${db_name}.${table_name} \
convert to character set utf8 collate utf8_general_ci;"
sleep 2
done < tables.txt
如果你不清楚 alter
语句使用方法,请参考《运维常用 mysql 语句》"修改表的字符集"的示例。
3. 执行脚本
bash -x convert_mysql_charset.sh
mysql 对于字符集的设置有四个层次:
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 = utf8
character_set_server = utf8
# 修改完后,重启mysql的服务。
/etc/init.d/mysqld restart
参考文章
最后来总结下文章中的知识点
latin1
,为了解决乱码问题请使用utf8
。shell
脚本+alter
语句批量更改字符集。欢迎关注微信公众号: 运维录