专栏首页运维录使用shell 批量更改 mysql字符集

使用shell 批量更改 mysql字符集

《复仇者联盟4:终局之战》队长退休。

开始之前


这里还有一个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 字符集


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 = utf8
character_set_server = utf8

# 修改完后,重启mysql的服务。
/etc/init.d/mysqld restart

参考文章

小结


最后来总结下文章中的知识点

  • 默认情况下,mysql的字符集是 latin1,为了解决乱码问题请使用utf8
  • 对于已经保存在mysql数据库的数据,可以使用shell脚本+alter语句批量更改字符集。

欢迎关注微信公众号: 运维录

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么Docker创建的MySQL容器字符乱码?

    这篇文章发布于 2016.11.03 ,记录如何解决 mysql容器查询结果乱码的问题。

    用户1560186
  • ​ mysql编译安装脚本

    这篇文章发布于 2015年,内容是介绍使用源码方式编译安装 mysql-5.6 ,时间回到 2015年,那时候 Docker还在蓄能阶段没有全面爆发。

    用户1560186
  • 使用 Docker 部署 phpmyadmin 应用

    phpmyadmin 是一个使用PHP语言开发的工具软件,可以通过web方式操作mysql数据库,例如添加、查询、变更、删除数据等。

    用户1560186
  • CentOS7下mysql5.6修改默认编码

    参考原文教程:Centos7下修改mysql5.6编码方式 解决网站中文显示问号 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所...

    Ryan-Miao
  • 听说淘宝双11销售额造假,我用拟合界的扛把子试了一下

    然而,今年双11最大的瓜却是,有网友认为历年双11的数据“太过完美”,有造假嫌疑。

    HuangWeiAI
  • 爱奇艺弹幕解码 JS+ArrayBuffer+ungzip+utf8ArrayToStr

    Eller
  • 前端基础-Ajax框架的封装

    如果一个页面中有十几个地方用到Ajax,那么我们需要写十几次open()、十几次send()、十几次获取xhr对象; 代码重复相当多,而凡是有代码重复的地方,...

    cwl_java
  • 使用junit测试用例

    通常只会使用junit测试非main方法,在我眼里就是程序入口实现而已。今天,发现原来可以测试类。 针对mybatis练习。在需要测试的UserDaoImpl类...

    Ryan-Miao
  • Ajax与Comet

    Ajax(Asynchronous JavaScript + XML的简写)可以向服务器请求数据而无需卸载(刷新)页面,带来更好的用户体验。 Ajax技术的...

    奋飛
  • 中信证券李伟:移动支付正当时

    移动互联网的扑面而来搅动了第三方支付的一江春水,移动支付在传统厂商左顾右盼的踌躇间成为新产业经济的关键词。是方兴未艾却挑战重重的二维码支付一枝独秀,还是踌躇多...

    腾讯研究院

扫码关注云+社区

领取腾讯云代金券