字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题。对于数据库来说,字符集又是比较重要的,因为数据库存储的数据大部分都是各种文字,字符集对于数据库的存储、处理性能以及数据迁移都有重要的影响。

如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以我们建议在应用开始阶段,就按照需求正确的选择合适的字符集,尽量避免后期不必要的调整。

mysql编译安装时,指定字符集的方法:

./configure  --with-charset=utf8

mysql的字符集有4个级别的默认设置:服务器级、数据库级、表级和字段级。分别在不同的地方设置,作用也不相同。
1、服务器字符集设定,在mysql服务启动的时候确定。
可以在my.cnf中设置:

[mysql]

### 默认字符集为utf8

default-character-set=utf8

[mysqld]
### 默认字符集为utf8

default-character-set=utf8

### (设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)

init_connect='SET NAMES utf8'

或者在启动选项中指定:
mysqld --default-character-set=utf8

如果没有特别的指定服务器字符集,默认使用latin1(ISO-8859-1的别名)作为服务器字符集。上面三种设置的方式都只指定了字符集,没有去做校对,我们可以用show variables like 'char%';命令查询当前服务器的字符
集和校对规则。

mysql>show variables like 'char%';

+--------------------------+----------------------------+

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

  +--------------------------+----------------------------+

注:如果增加default-character-set=utf8后,MYSQL启动报错。可以用character_set_server=utf8来取代default-character-set=utf8,就能正常启动了。这是因为MYSQL不同版本识别的问题。

2、数据库级

创建数据库时指定字符集

mysql>CREATE DATABASE my_db default charset utf8 COLLATE utf8_general_ci;

#注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8编码格式来排序

如果指定了数据库编码,那么在这个数据库下创建的所有数据表的默认字符集都会是utf8了

修改MYSQL数据库编码,如果是MYSQL数据库编码不正确,可以在MYSQL执行如下命令:

ALTER DATABASE my_db DEFAULT CHARACTER SET utf8;

以上命令就是将MYSQL的my_db数据库的编码设为utf8

3、 表级

创建表时指定字符集

mysql>create table my_table (name varchar(20) not null default '')type=myisam default charset utf8;

#这句话就是创建一个表,指定默认字符集为utf8

修改MYSQL表的编码:

ALTER TABLE my_table DEFAULT CHARACTER SET utf8;

以上命令就是将一个表my_table的编码改为utf8

4、 字段级

alter table test add column address varchar(110) after stu_id;

在stu_id后增加一个字段address

alter table test add id int unsigned not Null auto_increment primary key;

修改字段的编码:

ALTER TABLE `test` CHANGE `name` `name` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL

以上命令就是将MYSQL数据库test表中name的字段编码改为utf8

在命令行下插入汉字时如下代码:

set names utf8;有时候这一句很关键!

insert into charset values('王达');

注意:alter修改的方法不能更新已有记录的字符集,只是对新创建的表和记录生效。对已有记录字符集的调整,需要先将数据导出,经过适当调整后重新导入才可以完全修改编码。

导出导入的字符调整方法:

导出表结构

mysqldump -uroot -pmysql --default-character-set=latin1 -d  my_db> createtab.sql

手工修改createtab.sql表结构定义中的字符集为新的字符集

1、导出所有记录

mysqldump -uroot -pmysql --quick --no-create-info --extended-insert --default-character-set=latin1 --host=localhost  my_db> data.sql

2、打开data.sql,将set names latin1修改成set names utf8

:%s/latin1/utf8/g

全文替换

3、使用新的字符集创建新的数据库

create database  mydata  default charset utf8;

4、创建表,执行createtab.sql

mysql -uroot -pmysql mydata<creattab.sql

5、导入数据

mysql -uroot -pmysql mydata<data.sql

注意一点就是目标字符集要大于等于源字符集,否则会丢失一部分不支持的汉字数据。

附:旧数据升级办法

以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。

第一步:导出旧数据

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql

第二步:转换编码

iconv -t utf8  -f latin1 -c old.sql > new.sql

在这里,假定原来的数据默认是latin1编码。

第三步:导入

修改old.sql,增加一条sql语句: "SET NAMES utf8;",保存。

mysql -hlocalhost -uroot my_db < new.sql

大功告成!

mysql字符集调整总结的更多相关文章

  1. [MySQL] 字符集的选择

    1. Mysql支持的字符集 MySQL服务器可以支持多种字符集,不同的字段都可以使用不同的字符集. 查看所有可用字符集: show character set; select * from info ...

  2. mysql字符集小结

    http://blog.csdn.net/wyzxg/article/details/8779682 author:skatetime:2013/04/09 mysql字符集小结 今天同事阿杰兄发现内 ...

  3. MySQL字符集设置及字符转换(latin1转utf8)

    MySQL字符集设置及字符转换(latin1转utf8) http://blog.chinaunix.net/uid-25266990-id-3344584.html  MySQL字符集设置及字符转换 ...

  4. mysql字符集那些事

    1..查看mysql当前使用的字符集. 登录mysql 在mysql 里输入 show variables like 'character_set%' mysql> show variables ...

  5. MySQL字符集或字符序

        字符集基础 字符集:数据库中的字符集包含两层含义 各种文字和符号的集合,包括各国家文字,标点符号,图形符号,数字等. 字符的编码方式,即二进制数据与字符的映射规则:   字符集分类: ASCI ...

  6. 六、linux-mysql的mysql字符集问题

    一.什么是字符集? 字符集是用来定义mysql数据字符串的存储方式,而校对规则则是定义比较字符串的方式.mysql字符集包含字符集和校对规则. 二.字符集的选择 常见的字符集中,中英混合环境建议用UT ...

  7. MySQL字符集不一致导致性能下降25%,你敢信?

    故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...

  8. 2020重新出发,MySql基础,MySql字符集

    目录 MySQL字符集和校对规则详解 MySQL字符集的转换过程 MySQL查看字符集和校对规则 MySQL设置默认字符集和校对规则 服务器字符集和校对规则 数据库字符集和校对规则 表字符集和校对规则 ...

  9. 如何修改MySQL字符集

    首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则.这两个参数集可以在数据库实例.单个 ...

随机推荐

  1. 纯css3棋盘图案背景以及45度斜纹背景

    css代码  .stripes {     height: 250px;     width: 375px;     float: left;          margin: 10px;      ...

  2. 今天设置apache二级域名ssl证书后出现问题

    用集成环境 phpwamp重启服务失败,但是重启电脑后apache就启动成功,也不知道哪里原因,待以后解决.

  3. matomo 开源网站分析平台

    1.安装PHP https://www.jianshu.com/p/8d54a401ec06 yum remove php* yum -y install epel-release rpm -Uvh ...

  4. jfinal头像裁剪上传服务器

    前端页面完整代码,复制可用,记得导入库文件 <!DOCTYPE html> <html lang="en"> <head> <title& ...

  5. vue-webpack项目本地开发环境设置代理解决跨域问题

    前言: 一般跨域问题只要后端配置好的话,是不需要前端做处理的,但也不能保证你遇到的所有后端都能很好的处理这个问题,这个时候可能就需要前端设置代理解决这个问题了. 配置方法: 1. config/ind ...

  6. 【python中单链表的实现】——包括初始化、创建、逆序、遍历等

    # coding=utf-8 class mynode(object): def __init__(self, data, nextnode = None): self.data = data sel ...

  7. 洛谷 P1342 请柬(SPFA)

    题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请 ...

  8. FortiGate密码恢复

    1.需求 1.若设备的密码忘记,需要用配置线进行密码恢复: 2.密码恢复需要重启设备,并在设备的底层菜单界面上操作,会造成网络中断,请在方便断网时操作: 3.密码恢复后配置不会改变. 2.操作步骤 1 ...

  9. mysql 索引 create_time 加explain关键字是否走索引

    SELECT * FROM t_user WHERE email='217@xxg.com';  --1.725 --加email索引之后 0.003 SELECT * FROM t_user WHE ...

  10. 【分布式架构】“spring cloud”与“dubbo”微服务的对比

      秉承站在巨人的肩膀上,同时我也不想重复制造轮子,我发现了一系列关于“分布式架构”方面,我需要,同时能够解决我的一些疑惑.问题的博客,转载过来,原文链接: http://blog.csdn.net/ ...