Mysql-字符集实战

概述

最近在并行学习mysql,字符集其实是很多初学者都理不清的问题,正好最近学到这部分,借这个机会跟大家一起整理一下

一、Mysql数据库字符集

1.1 查看字符集相关

查看mysql当前字符集

mysql> show variables like 'character%';
+--------------------------+-------------------------------------+
| Variable_name            | Value                               |
+--------------------------+-------------------------------------+
| character_set_client     | utf8                                |
| character_set_connection | utf8                                |
| character_set_database   | utf8                                |
| character_set_filesystem | binary                              |
| character_set_results    | utf8                                |
| character_set_server     | utf8                                |
| character_set_system     | utf8                                |
| character_sets_dir       | /mysql/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------+
8 rows in set (0.00 sec)
  • character_set_client:客户端请求数据的字符集
  • character_set_connection:客户机/服务器连接的字符集
  • character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
  • character_set_filesystem:文件系统字符集,把os上文件名转化成此字符集,即把 character_set_client 转换 character_set_filesystem, 默认binary是不做任何转换的
  • character_set_results:结果集,返回给客户端的字符集
  • character_set_server:数据库服务器的默认字符集
  • character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。

校验规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则
查看字符集对应支持的校验规则

mysql>show character set;

mysql> show variables like 'collation%'; --查看当前校验规则
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | utf8_general_ci   |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

1.2 设置客户端字符集

更改客户端字符集,也就是更改了客户端的字符集参数,更改后不需要重启mysql
客户端字符集参数:
character_set_client,character_set_connection,character_set_results 三个的字符参数集合系统的字符集是一致

  • 临时设置
  1. 方法一:
    打开mysql的时候通过指定字符集–default-character-set
mysql -uroot -p123456 -S /data/3306/mysql.sock --default-character-set=utf8
--仅对当次登录生效
  1. 方法二:
    通过set names utf8 临时设置客户端字符集
set names utf8
  • 永久设置
  1. my.cnf中配置default-character-set参数
$ vi my.cnf 
[client]
default-character-set=utf8

1.3 设置服务器字符集

  • 配置my.cnf文件来永久设置mysql服务器字符集
[mysqld]
default-character-set=utf8 --5.1版本使用
character-set-server=utf8 --其他版本使用

这里只会更改character_set_server的值,已创建过的数据库字符集character_set_database不会更改

1.4 设置数据字符集

设置数据库字符集就是对character_set_database的更改。
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。

  • 方法一
    更改当前使用数据库的character_set_database
alter database character set utf8;
or
ALTER DATABASE db_name DEFAULT CHARACTER SET character_name
  • 方法二
    建库时指定默认字符集参数
create database xxx default character set  utf8 collate utf8-general-ci

注:下面会讲如何更改已存有数据的数据库的字符集。

1.5 设置表字符集

表的字符集如果后期更改设置导入导出

ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name

二、MySQL字符集相关问题处理

2.1 字符集乱码处理

处理乱码,就一句话:把客户端和服务端的字符集统一!

  • 查看当前字符集
mysql> show variables like 'character_set%';
+--------------------------+-------------------------------------+
| Variable_name            | Value                               |
+--------------------------+-------------------------------------+
| character_set_client     | utf8                                | -客户端字符集
| character_set_connection | utf8                                | -连接字符集
| character_set_database   | latin1                              | -数据库字符集
| character_set_filesystem | binary                              | -文件系统字符集
| character_set_results    | utf8                                | -返回结果字符集
| character_set_server     | latin1                              | -服务器字符集
| character_set_system     | utf8                                | -系统字符集
| character_sets_dir       | /mysql/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------+
  • 在my.cnf中设置统一的客户端和服务器字符集
[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8 --5.1版本参数
character-set-server=utf8 --5.1以上版本使用
  • 重启mysql
 /data/3306/mysql restart

[root@study 3306]# netstat -lntup|grep 330 --检查是否mysql启动成功
tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      87761/mysqld        
tcp        0      0 0.0.0.0:3308                0.0.0.0:*                   LISTEN      89764/mysqld        
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      104482/mysqld       
 
 mysql -uroot -p123456 -S /data/3306/mysql.sock -打开mysql
  • 检查是否修改正确
mysql> show variables like 'character_set%';
+--------------------------+-------------------------------------+
| Variable_name            | Value                               |
+--------------------------+-------------------------------------+
| character_set_client     | utf8                                |
| character_set_connection | utf8                                |
| character_set_database   | utf8                                |
| character_set_filesystem | binary                              |
| character_set_results    | utf8                                |
| character_set_server     | utf8                                |
| character_set_system     | utf8                                |
| character_sets_dir       | /mysql/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------+
8 rows in set (0.01 sec)

2.2 更改数据库的字符集正确步骤

1) 导出表结构
导出-default-character-set=latin1 设置旧的字符集,统一字符集

mysqldump -uroot -p -default-character-set=latin1 -d dbname >table.sql

2) 编辑table.sql,将latin1替换成utf8

3)停业务导出表数据

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 -S /data/3306/mysql.sock dbname> data.sql
  • –quick 用于转储大的表
  • –no-create-info 不创建create table语句
  • –extended-insert 包括几个values多行insert,文件更小
  • –default-character-set 按照原有字符集导出,就不会出乱码

4)编辑修改data.sql 将set names latin1 改成set names utf8;

5)建库指定 utf8

create database test default charset utf8;

6)创建表,导入表结构

mysql -uroot -p dbname <table.sql

7)导入数据

mysql -uroot -p dbname <data.sql

总结

其实字符集问题,在前期部署规划的时候就应该跟应用开发人员协调好,形成规范;程序使用字符集,客户端字符集,服务器字符集三集保持一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值