前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用shell 批量更改 mysql字符集

使用shell 批量更改 mysql字符集

作者头像
用户1560186
发布2020-01-15 16:16:30
1.7K0
发布2020-01-15 16:16:30
举报
文章被收录于专栏:运维录运维录
《复仇者联盟4:终局之战》队长退休。

开始之前

这里还有一个mysql字符乱码的例子,部署redmine过程中,mysql数据库使用了默认的字符集,导致含有中文内容为乱码。

解决这个问题有两种方法:

一、参考《为什么Docker创建的mysql容器字符乱码?》这篇文章,重来一遍并选择正确的字符集。

二、修改配置文件设置utf8字符集,对已经存在的数据使用alter语句修改数据表的字符集

这里采用第二种方式,不过数据库内的数据表较多,我们使用shell脚本批量完成这个工作。

环境描述

redmine 需要 php + mysql 运行环境 (LNMP)

代码语言:javascript
复制
mysql版本: mysql-5.6
php版本: 5.6
redmine: 2.6
database.yml 编码为 encoding: utf8
操作步骤

1. 配置文件

代码语言:javascript
复制
# 写入转换字符集的表名,每行一个。

cat tables.txt

attachments                        
workflows  
# 省略....

2. shell脚本

代码语言:javascript
复制
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. 执行脚本

代码语言:javascript
复制
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

代码语言:javascript
复制
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)中的字符集

代码语言:javascript
复制
cat /etc/my.cnf

# 其它配置项省略...

default-character-set = utf8
character_set_server = utf8

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

参考文章

小结

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《复仇者联盟4:终局之战》队长退休。
  • 开始之前
  • 环境描述
  • 操作步骤
  • MySql 字符集
  • 小结
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档