No.05_MySQL数据库字符集7 min read

  • A+
所属分类:MySQL

目录

  1. MySQL数据库字符集简介

     1.1 MySQL常见字符集

     1.2 MySQL如何选择合适的字符集?

  2. 字符集操作实践

     2.1 查看当前MySQL系统支持的字符集

     2.2 MySQL数据库默认设置的字符集是什么?

     2.3 更改客户端字符集

     2.4 更改MySQL服务端(数据库)字符集

  3. 字符集统一的情况下如何保证数据库不乱码呢?

  4. 如何更改生产MySQL数据库库表的字符集

     4.1 对于新数据库无数据的情况下改库和表的字符集

     4.2 对数据库中有数据的情况下修改字符集

  

   

1. MySQL数据库字符集简介

  

   简单地说,字符集就是一套文字符号及其编码,比较规则的集合,第一个计算机字符集ASCII

   MySQL数据库字符集包括字符集(CHARACTER)和小队规则(COLLATION)两个概念,期中字符集是用来定义MySQL数据字符串的存储方式,而校对规则则是定义比较字符串的方式。

   在编译安装MySQL时,指定字符集了,这样以后建库的时候就直接create database oldboy;而不需要去指定字符集了,因为它创建的默认就是我们我们编译指定的字符集,如果在工作中创建数据表或者库的时候也是可以指定和修改字符集的。

   二进制安装MySQL,他默认的就是latinl,此时需要建立字符集为UTF8字符集的库,那么久需要我们指定啦。

  

1.1 MySQL常见字符集

  

常用字符集 一个汉字长度 说明
UTF8 3 中英文混合的环境,建议使用此字符集,用的比较多的
GBK 2 不是国际标准,对中文环境支持的很好
latinl 1 MySQL的默认字符集
utf8mb4 4 UTF-8 Unicode,移动互联网

    

1.2 MySQL如何选择合适的字符集?

   

   1. 如果处理各种各样的文字,发布到不同语言国家地区,应选Unicode字符集,对mysql来说就是UTF-8(每个汉字3个字节),也会相应的占用空间,如果应用需处理英文,仅有少量汉字UTF-8更好。

   2. 如只需支持中文,并且数据量很大,性能要求也很高,可选GBK(定长每个汉字占双字节,英文也占双字节),如果需大量运算,比较程序等,定长字符集,更快,性能高。

   3. 处理移动互联网业务,可能需要使用utf8mb4字符集。

  

建议:没有特别需求,请选择UTF-8,目前最通用的,存储量就是稍微大一点,GBK就是支持中文。

   

2. 字符集操作实践

  

2.1 查看当前MySQL系统支持的字符集

  

MySQL可支持多种字符集,同一台机器、库或表的不同字段都可以指定不同的字符集。

查看MySQL支持的字符集,更详细的内容参考mysql手册。

[root@db01 /]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock   #<== 登录数据库
mysql> show character set;                       #<== 查看当前MySQL支持的字符集
+---------+---------------------------+-------------------+--------+
| Charset | Description               | Default collation | Maxlen |
+---------+---------------------------+-------------------+--------+
| big5    | Big5 Traditional Chinese  | big5_chinese_ci   |      2 |
| gbk     | GBK Simplified Chinese    | gbk_chinese_ci    |      2 |
| utf8    | UTF-8 Unicode             | utf8_general_ci   |      3 |
----------------部分内容输出省略---------------------
+---------+---------------------------+-------------------+--------+
39 rows in set (0.12 sec)
#说明:比较常用的字符集有latinl、gbk、utf8、utf8mb4,这4个里面最常用的就是utf8

  

2.2 MySQL数据库默认设置的字符集是什么?

  

查看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        | /application/mysql-5.5.49/share/charsets/ |
+---------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

#注意:要想保证数据库不乱码,以上黄色部分的字符集最好要保持一致。

   

不同字符集参数的含义如下:

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          | /application/mysql-5.5.49/share/charsets/ |

   

2.3 更改客户端字符集

  

方法1:使用一条命令修改3个客户端的字符集(临时生效) 

mysql> set names gbk;                     #<== 更改客户端字符集为gbk
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like "character_set%";
+---------------------------+-------------------------------------------+
| Variable_name             | Value                                     |
+---------------------------+-------------------------------------------+
| character_set_client      | gbk                                       |
| character_set_connection  | gbk                                       |
| character_set_database    | utf8                                      |
| character_set_filesystem  | binary                                    |
| character_set_results     | gbk                                       |
| character_set_server      | utf8                                      |
| character_set_system      | utf8                                      |
| character_sets_dir        | /application/mysql-5.5.49/share/charsets/ |
+---------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

说明:set names gbk;就是把上面的3个参数改成了gbk,也就是说character_set_clientcharacter_set_connectioncharacter_set_results者的字符集和默认会和linux系统的字符集一致。但是当在mysql中执行setnames字符集操作后,这三者都会改变为设置的字符集,但是命令修改是临时生效的。

    

方法2:如果想修改单个客户端字符集使用如下命令

set names gbk;也可以使用下面三个命令替代(临时生效)

SET character_set_client = gbk;                  #<== 客户端字符集
SET character_set_connection = gbk;              #<== 客户端连接字符集
SET character_set_results = gbk;                 #<== 客户端返回结果字符集

    

方法3:登录数据数据库时更改客户端字符集

已知当前mysql字符集为utf8,使用“--default-character-set=字符集”更改(临时生效)

[root@db01 /]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character-set=gbk
mysql> show variables like "character_set%";
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | gbk                                       |
| character_set_connection | gbk                                       |
| character_set_database   | utf8                                      |
| character_set_filesystem | binary                                    |
| character_set_results    | gbk                                       |
| character_set_server     | utf8                                      |
| character_set_system     | utf8                                      |
| character_sets_dir       | /application/mysql-5.5.49/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

   

方法4:在配置文件更改字符集(永久生效)

client模块下增加修改字符集的参数,不需要重启数据库(因为它是客户端)

[root@db01 /]# vim /data/3306/my.cnf
[client]
default-character-set=gbk

注意:要想数据库不乱码,要保持客户端的字符集统一

  

2.4 更改MySQL服务端(数据库)字符集

  

方法1:配置文件修改法

  

1 按如下来更改my.cnf参数 

[root@db01 /]# vim /data/3306/my.cnf
[mysqld]
default-character-set=gbk         #<== 适合5.1及以前版本
character-set-server=gbk          #<== 适合5.5及以上(现在我们再配置文件中加此行参数) 

  

2. 重启数据库

[root@db01 /]# /data/3306/mysql restart
Restarting MySQL...
Stoping MySQL...
Starting MySQL...

3. 进入数据库后查看

[root@db01 /]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
mysql> show variables like "character_set%";
+---------------------------+-------------------------------------------+
| Variable_name             | Value                                     |
+---------------------------+-------------------------------------------+
| character_set_client      | utf8                                      |
| character_set_connection  | utf8                                      |
| character_set_database    | gbk                                       |
| character_set_filesystem  | binary                                    |
| character_set_results     | utf8                                      |
| character_set_server      | gbk                                       |
| character_set_system      | utf8                                      |
| character_sets_dir        | /application/mysql-5.5.49/share/charsets/ |
+---------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

#强调:以上在配置文件mysqld模块下设置的参数会更改黄色部分的字符集(服务端)。

    

方法2: 编译安装MySQL时指定mysql数据路服务端字符集


在编译安装MySQL时也可以指定字符集,编译参数(黄色部分)如下:

cmake . -DCMAKE_INSTALL_PREFIX=/mysql-5.5.49 \
-DMYSQL_DATADIR=/mysql-5.5.49/data \
-DMYSQL_UNIX_ADDR=/mysql-5.5.49/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_READLINE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0

      

3. 字符集统一的情况下如何保证数据库不乱码呢?

    

 a:操作习惯:尽量不在MySQL命令行直接插入数据(SSH客户端影响),SQL语句文件形式。

 bSQL文件的格式统一为“utf8没有签名

 c:导入文件方式

    1. 可在MySQL命令行中用source执行SQL文件。

    2. 命令方式导入数据mysql -uroot -poldboy123 oldboy <test.sql

    3. mysql -uroot -poldboy123 oldboy -default-charater-set=utf8 <test.sql


 1.客户单端字符集统一

 2.服务端字符集统一

 3.建库建表字符集要统一

 4.程序要和库表统一

 5.Linux客户端(CRT字符集)

 6.不乱码的思想:建议中英文环境选择utf8

  

1. linux系统服务端

[root@db01 /]# cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
[root@db01 /]# . /etc/sysconfig/i18n
[root@db01 /]# echo $LANG
en_US.UTF-8

   

2. linux系统客户端

No.05_MySQL数据库字符集

 

3. MySQL数据库的服务端字符集

#更改my.cnf参数
[mysqld]
default-character-set=gbk        #<== 适合5.1及以前版本
character-set-server=gbk         #<== 适合5.5及以上(现在我们再配置文件中加此行参数)
#影响数据库中字符集对应项
    character_set_database 
    character_set_server

   

4. MySQL数据库的客户端字符集


临时更改生效


1:修改客户端的字符集(包括3个)

提示:set names gbk                     #<== 也可以用下面三个命令替代

  

法2在数据库中单条命令修改单一的字符集

SET character_set_client = gbk;         #<== 客户端字符集
SET character_set_connection = gbk;     #<== 客户端连接字符集
SET character_set_results = gbk;        #<== 客户端返回结果字符集

   

法3在进入数据库时指定字符集

mysql -uroot -poldboy123 -S /data/3306/mysql.sock --default-character-set=gbk

  

法4永久生效

通过修改my.cnf实现修改mysql客户端字符集,配置方法如下(永久生效):
[client]
default-character-set=gbk
# 注意:要修改/etc/my.cnf,可以实现set names utf8的效果,并且永久生效。

提示:无需重启服务,退出重新登录就生效,相当于set names gbk;
目前多实例优点小问题

   

5. MySQL数据库中建库建表(指定字符集建库)


指定字符集建库

create database test_utf8 default character set utf8 collate utf8_general_ci;

    

建表:

create table test(
id int(4) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

    

6:开发的程序的字符集

简体:UTF8

http://download.comserz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip 

    

4. 如何更改生产MySQL数据库库表的字符集

   

数据字符集修改步骤

    对于已有的数据库想修改字符集不能直接通过“alter database character set=*”或“alter table tablename character set *”,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。

    已经有记录的字符集的调整,必须先将数据导出,经过修改字符集后重新导入后才可完成。

  

4.1 对于新数据库无数据的情况下改库和表的字符集

   

1. 更改oldboy库的字符集

[root@db01 /]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
mysql> show databases;
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| oldboy               |
| performance_schema   |
+----------------------+
4 rows in set (0.00 sec)

mysql> show create database oldboy\G          #<== 查看当前oldboy字符集为utf8
*************************** 1. row ***************************
       Database: oldboy
Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)

mysql> show character set;                       #<== 查看当前MySQL支持的字符集
+---------+---------------------------+-------------------+--------+
| Charset | Description               | Default collation | Maxlen |
+---------+---------------------------+-------------------+--------+
| big5    | Big5 Traditional Chinese  | big5_chinese_ci   |      2 |
| gbk     | GBK Simplified Chinese    | gbk_chinese_ci    |      2 |
| utf8    | UTF-8 Unicode             | utf8_general_ci   |      3 |
----------------部分内容输出省略---------------------
+---------+---------------------------+-------------------+--------+
39 rows in set (0.12 sec)
 
mysql> alter database oldboy character set gbk collate = gbk_chinese_ci;   #<== 修改为gbk
Query OK, 1 row affected (0.10 sec)
 
mysql> show create database oldboy\G                   #<== 修改后查看确认
*************************** 1. row ***************************
       Database: oldboy
Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET gbk */
1 row in set (0.00 sec)

      

2. 更改表的字符集 

mysql> use oldboy;                     #<== 进入oldboy数据库
Database changed

mysql> show tables;                    #<== 查看oldboy数据库中有哪些表
+-------------------+
| Tables_in_oldboy  |
+-------------------+
| backupstep        |
| test              |
+-------------------+
2 rows in set (0.00 sec)
 
mysql> show create table oldboy.test\G;      #<== 查看test表当前的字符集
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
 
mysql> alter table oldboy.test character set gbk;   #<== 将test表字符集修改为gbk
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0Warnings: 0
 
mysql> show create table oldboy.test\G              #<== 修改后确认        
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

特别说明:修改字符集后对后插入的数据生效,对数据库原有数据不会生效

   

4.2 对数据库中有数据的情况下修改字符集

  

下面模拟将latinl字符集的数据库修改成UTF8字符集的实际过程。

  

1. 导出表结构

mysql -uroot -poldboy123 --default-character-set=utf8 -d dbname >alltable.sql
# 说明:导出数据时指定字符集;参数--default-character-set=utf8表示UTF8字符集进行链接,-d 只导表结构。

  

2. 编辑表结构语句alltable.sql将所有latinl字符串改成UTF8

  

3. 确保数据库不再更新,导出所有数据(不带表结构)。

mysql -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latinl -d dbname >alltable.sql

参数说明:

--quick用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,并输出前CACHE到内存中。

--no-create-info不创建CREATE TABLE 语句。

--extended-insert使用包括几个VALUES列表的多行INSERT语法,这样文件更小,IO也小,导入数据时会非常快。

--default-character-set=latinl按照原有字符集导出数据,这样导出的文件中,所有中文都会是可见的,不会保存成乱码。


4. 修改my.cnf配置调整客户端及服务端字符集,重启生效。

   

5. 通过utf8建库(可选)

   删除原库,然后create database dbname default charset utf8


6. 导入表结构(更改过字符集的表结构)。

mysql -uroot -p dbname <alltable.sql

   

7. 导入数据

mysql -uroot -p123456 dbname <alldata.sql

注意:选择目标字符集时,要注意最好大于等于源字符集(字库更大),否则可能会丢失不被支持的数据。

   

字符集修改问题:

只对新数据生效,对老数据无效

alter table test character set = gbk    collate gbk_chinese_ci
alter database oldboy CHARACTER SET latinl COLLATE = latinl_swedish_ci

  

更改字符集的思想:

  1. 数据库不要更新,到处所有数据。

  2. 把导出的数据进行字符集替换(替换表和库)。

  3. 修改my.cnf,修改MySQL客户端服务端字符集,重启生效。

  4. 导入更改过字符集的数据,包括表结构语句,提供服务。

  5. SSH客户端,以及程序更改为对应字符集。

   

   


zhaoyulin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: