在生成环境中,会经常碰到Mysql字符的设置问题,个人也总结下。

如果在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,那么就需要进行字符集的修改。字符集的修改不能直接通过alter dataabase character set ***; 或者 alter table tablename character set ***; 命令进行,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。

在笔者的数据库最为常用的是latin1、utf8,由于项目的整合,字符的要求也开始规范,统一为utf8,那么就需要把之前的latin1字符转换成才utf8格式,那样才不会出现乱码的情况。已有的记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才可完成。

以下模拟的是将latin1字符集的数据库修改成GBK字符集的数据库的过程。操作较为简单,只要花的时间是在导入和导出数据。下面就来简单的介绍Mysql字符变量和latin1转换到utf8的过程,大家可以根据自己实际情况,举一反三。

一、MySQL字符集设置

• 系统变量:

– character_set_server:默认的内部操作字符集

– character_set_client:客户端来源数据使用的字符集

– character_set_connection:连接层字符集

– character_set_results:查询结果字符集

– character_set_database:当前选中数据库的默认字符集

– character_set_system:系统元数据(字段名等)字符集

– 还有以collation_开头的同上面对应的变量,用来描述字符序。

• 用introducer指定文本字符串的字符集:

– 格式为:[_charset] ‘string’ [COLLATE collation]

– 例如:

• SELECT _latin1 ‘string’;

• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

–由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。

二、MySQL中的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

• 若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results。

三、latin1转换到utf8

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

mysql>showcreatedatabase databasename;

|Database|CreateDatabase|

| databasename |CREATEDATABASE`databasename`/*!40100 DEFAULT CHARACTER SET latin1 */|

1 row inset(0.00 sec)

1> 导出表结构:

mysqldump -uroot -p –default-character-set=utf8 -d databasename > createtab.sql

其中--default-character-set=utf8 表示设置以什么字符集连接, -d 表示只导出表结构,不导出数据。

2>修改createtab.sql中表结构定义中的字符集为新的字符集。

sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl “CHARSET=latin1″ createtab.sql `

3>确保记录不再更新,导出所有记录。

mysqldump --default-character-set=latin1  -uroot -p –no-create-info databasename > data.sql

可选参数:

–quick: 该选项用于转储大的表。 它强制 mysqldump 从服务器一次一行地检索表中的行而不是 检索所有行,并在输出前将它缓存到内存中。

–extended-insert: 使用包括几个 values 列表的多行insert语法,这样使转储文件更小,重载文件时可以加速插入。

–no-create-info: 不写重新创建每个转储表的create table 语句。

–default-character-set=latin1: 按照原有的字符集导出所有数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。不添加该参数以默认字符导出。

4>打开data.sql,将 set names latin1 修改成 set names utf8 。

#sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl “CHARSET=latin1″ data.sql `

(PS:sed工作效率是非常高的,在测试中60G的数据4分钟就转换完毕了)

5>使用新的字符集创建新的数据库。

create database new_databasename default charset utf8;

6>创建表,执行 createtab.sql

mysql -uroot -p new_databasename

7>导入数据,执行data.sql

mysql -uroot -p new_databasename

8、查看新数据库的字符信息

mysql>showcreatedatabase new_databasename;

|Database|CreateDatabase|

| new_databasename |CREATEDATABASE`new_databasename`/*!40100 DEFAULT CHARACTER SET utf8 */|

1 row inset(0.00 sec)

mysql>showcreatetable type;

|Table|CreateTable|

| type |CREATETABLE`type`(

`id`int(10)NOTNULLAUTO_INCREMENT,

`Name`varchar(100) CHARACTER SET gb2312 NOTNULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULTCHARSET=utf8 |

1 row inset(0.00 sec)

注意:选择字符集的时候,要注意最好是源字符的超级,或者确定比源字符集的字库更大。

4.0-->5.x升级后续整理中……

4.0 (latin1)  升级到  5.5(utf8)

root@localhost lib]# /usr/local/mysql4/bin/mysqldump -S /tmp/mysql4.sock   --default-character-set=latin1  -hlocalhost  -uroot -B hhl --tables t > t_old.sql

mysql  --default-character-set=utf8 hhl

mysql> select * from t ;

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

| id   | name |

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

|    2 | ??   |

|    1 | ??   |

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

2 rows in set (0.00 sec)

mysql> set names utf8;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t ;

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

| id   | name   |

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

|    2 | 张晓 |

|    1 | 祖国 |

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

2 rows in set (0.00 sec)

修改mysql默认字符集为latin1_MySQL字符集设置及字符转换(latin1转utf8)相关推荐

  1. linux修改mysql默认大小写配置,linux下设置mysql不区分大小写

    背景 今天准备上线的环境,往服务器上布服务,某个功能查询报错,觉得很奇怪,环境一样,代码一样,数据一样,为何呢,看了一眼sql.本地运行正常,上线环境报错,报错信息缺少某列.仔细一看,where 条件 ...

  2. 修改mysql默认字符集的方法

    mysql默认字符集能否进行修改呢?答案是肯定的,下面就将教您两种修改mysql默认字符集的方法,希望对您学习mysql默认字符集方面能有所启迪. 1. 修改my.cnf vi /etc/my.cnf ...

  3. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...

    本文主要向大家介绍了MySQL数据库之修改mysql默认字符集的两种方法详细解析 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. (1) 最简单的修改方法,就是修改mysql的m ...

  4. 修改mysql默认字符集为latin1_修改MYSQL默认编码为UTF8

    修改 MYSQL 默认编码为 UTF8 MySQL 的默认编码是 Latin1 , 不支持中文, 那么如何修改 MySQL 的默认编码呢, 下面以 UTF-8 为例来说明 需要注意的是, 要修改的地方 ...

  5. [mysql][ MySQL字符集设置及字符转换]

    [mysql][ MySQL字符集设置及字符转换] 标签(空格分隔): 未分类 在生成环境中,会经常碰到Mysql字符的设置问题,CU很多牛人都说过N次了,个人也总结下. 如果在应用开始阶段没有正确的 ...

  6. Linux下使用MySQL——忘记root密码及修改MySQL默认编码

    概述: 本博客不再对MySQL的语法进行讲解和说明,想了解或熟悉的朋友请自行百度或Google学习.本博客主要是针对MySQL除语法之外的总结,希望能够也能帮助到你. 1.CentOS6.x下MySQ ...

  7. yum mysql的安装目录在哪_linux下yum安装 mysql 及详细配置及修改mysql默认目录

    linux下yum安装 mysql 及详细配置及修改mysql默认目录. 一.[root@sample ~]# yum -y install mysql-server ← 安装MySQL -..略 I ...

  8. MySQL如何修改表的储存方式_修改mysql默认存储引擎的方法

    修改mysql默认存储引擎的方法,供大家学习参考. 先来了解一下mysql存储引擎: mysql服务器采用了模块化风格,各部分之间保持相对独立,尤其体现在存储架构上.存储引擎负责管理数据存储,以及my ...

  9. xampp mysql是空的_xampp中修改mysql默认空密码(root密码)的方法分享

    参考了网上提供的一些方法,发现说的都挺复杂.下面同大家分享一种简单快捷的方法. 首先说明下mysql用户的相关信息是保存在mysql数据库的user表中的,并且该表的密码字段(Password)是通过 ...

最新文章

  1. 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
  2. rnn词性标注算法_Python预测算法哪家强?权游龙妈是生还是凉凉?
  3. 普通人为什么要学习Python
  4. Redis数据类型--字符串类型
  5. iPhone清理喇叭灰尘_厉害了,iPhone 专用的网购商品历史最低价查询工具
  6. 数据库的时间格式(毫秒表示)
  7. docker 启动镜像_Docker学以致用,开源项目和云服务,是最好的学习资源
  8. 37. Never redefine a function's iherited default parameter value.
  9. 数据分析 时间序列分析 ARMA模型
  10. chromebook安装devos和chrome os双启动经验分享
  11. 选拔人才要关注的七个方面
  12. 点餐系统第一阶段工作总结
  13. GWO灰狼优化算法综述(Grey Wolf Optimization)
  14. 输入netsh winsock reset 重启电脑生效
  15. 修改Chem 3D模型的化学键属性的方法有哪些
  16. 如何合并视频?教你把多个视频合并成一个视频
  17. 人撒娇地撒基督教扫ID祭扫我京东is啊单间
  18. 【高等数学】第 6 讲 积分
  19. 幼儿园语言活动包括哪几类_幼儿园健康活动分为哪几类,幼儿园教育活动包括...
  20. PHPOK 5.2.009 发布

热门文章

  1. 技术干货 | pytest 自动化测试实战展示
  2. Android之Goldfish
  3. Flink 在米哈游的应用实践
  4. FFMPEG解码流程
  5. 【PAT】A1006 Sign In and Sign Out (25) (查找)
  6. A.机器学习入门算法(五):基于企鹅数据集的决策树分类预测
  7. Latex教程--详细版
  8. 一文秒懂反激开关电源的原理
  9. Embedding理解、Keras实现Embedding
  10. 高收益的笨办法:暴破在Windows提权中的应用