【mysq】一次扩展平台引发的字符集调整

公司app(安卓)应用扩展ios平台(安卓客户端已经运行一年),由于ios自带emoji表情字符集,api会出现问题,mysql数据库更换utf8mb4,原字符集utf8。

utf8mb4和utf8到底有什么区别呢?原来以往的mysql的utf8一个字符最多3字节,而utf8mb4则扩展到一个字符最多能有4字节,所以能支持更多的字符集。

主要思想导出数据,重新建库插入数据

1.查看当前数据库是否支持utf8mb4(貌似版本低于5.5.3的不能用,没测试)

mysql> show charset like ‘utf8mb4‘;
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |  #<--支持utf8mb4字符集
+---------+---------------+--------------------+--------+
1 row in set (0.00 sec)

2.停库方案(无法停库可以锁库只读)

PS:无法提供真实数据,以下只做模拟数据

当前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.32/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

模拟库和表

创建库

mysql> create database app character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show databases like ‘app‘;
+----------------+
| Database (app) |
+----------------+
| app            |
+----------------+
1 row in set (0.00 sec)

mysql> show create database app\G
*************************** 1. row ***************************
       Database: app
Create Database: CREATE DATABASE `app` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)

创建表

随意模拟两张表

mysql> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `uid` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table userclient\G
*************************** 1. row ***************************
       Table: userclient
Create Table: CREATE TABLE `userclient` (
  `uid` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

模拟数据

mysql> insert into user(name) values(‘evan‘),(‘cker‘),(‘niuniu‘);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into userclient(name) values(‘c_埃文‘),(‘c_瑟可‘),(‘c_牛牛‘);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

3.导出表结构并修改字符集

[[email protected] ~]# mysqldump -uroot -p --default-character-set=utf8 -d app >/opt/app_utf8.sql

--dafault-character-set=utf8 以utf8字符集导出表结构,防止乱码

修改表结构的字符集

[[email protected] ~]# sed -i ‘[email protected]@[email protected]‘ /opt/app_utf8.sql

4.确保数据不更新,导出所有数据

[[email protected] ~]# mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=utf8 app >/opt/appdata.sql

--quit           用于转存大表使用

--no-create-info    不创建create table语句

--extended-insert    使用多行insert语法,减少io读写,和速度

--default-character-set=utf8 按照原有字符集导出,防止乱码

5.重新建库

mysql> drop database app;
Query OK, 2 rows affected (0.05 sec)

mysql> show databases like ‘app‘;
Empty set (0.00 sec)

mysql> create database app character set=utf8mb4 collate=utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show create database app\G
*************************** 1. row ***************************
       Database: app
Create Database: CREATE DATABASE `app` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */
1 row in set (0.00 sec)

6.导入表结构和数据

修改客户端字符集和库一致

mysql> set names utf8mb4;       
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘character_set%‘;
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | utf8mb4                                   |
| character_set_connection | utf8mb4                                   |
| character_set_database   | utf8                                      |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8mb4                                   |
| character_set_server     | utf8                                      |
| character_set_system     | utf8                                      |
| character_sets_dir       | /application/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)

导入表结构

mysql> use app;    #<--进入库

mysql> source /opt/app_utf8.sql;  #<--执行备份的sql文件

mysql> show tables;
+---------------+
| Tables_in_app |
+---------------+
| user          |
| userclient    |
+---------------+
2 rows in set (0.00 sec)

mysql> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `uid` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4       #<--字符集为utf8mb4
1 row in set (0.00 sec)
mysql> show create table userclient\G
*************************** 1. row ***************************
       Table: userclient
Create Table: CREATE TABLE `userclient` (
  `uid` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

导入数据

mysql> source /opt/appdata.sql;
......

查询数据是否正常

mysql> select * from userclient;
+-----+----------+
| uid | name     |
+-----+----------+
|   1 | c_埃文   |
|   2 | c_瑟可   |
|   3 | c_牛牛   |
+-----+----------+
3 rows in set (0.00 sec)

mysql> select * from user;
+-----+--------+
| uid | name   |
+-----+--------+
|   1 | evan   |
|   2 | cker   |
|   3 | niuniu |
+-----+--------+
3 rows in set (0.00 sec)

导入数据乱码错误方法

mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> use app;
Database changed

mysql> select * from userclient;
+-----+--------+
| uid | name   |
+-----+--------+
|   1 | c_°£τ     |
|   2 | c_   |
|   3 | c_   |
+-----+--------+
3 rows in set (0.00 sec)

上述原因客户端和库表字符集不一样

mysql> show variables like ‘character_set%‘;
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | gbk                                       |
| character_set_connection | gbk                                       |
| character_set_database   | utf8mb4                                   |
| character_set_filesystem | binary                                    |
| character_set_results    | gbk                                       |
| character_set_server     | utf8                                      |
| character_set_system     | utf8                                      |
| character_sets_dir       | /application/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------------+

7.服务端默认字符处理(如非必要可以不用处理,只要保证【客户端,和库表】字符一致即可)

客户端

临时生效 (set names 字符集)

永久生效 更改配置文件my.cnf的[client]模块

[client]

default-character-set=字符集     #<--添加这一条语句,无需重启服务即可

服务端

更改配置文件my.cnf的[mysqld]模块

[mysqld]

default-character-set=字符集  适合5.1及以前版本

character-set-server=字符集适合5.5

时间: 2024-10-18 02:48:11

【mysq】一次扩展平台引发的字符集调整的相关文章

mysql字符集调整总结

mysql字符集调整总结 --http://xjsunjie.blog.51cto.com/999372/1355013 字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题.对于数据库来说,字符集又是比较重要的,因为数据库存储的数据大部分都是各种文字,字符集对于数据库的存储.处理性能以及数据迁移都有重要的影响. 如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以我们建议

CentOS 6部署Openfire 扩展平台聊天功能。

openfire 是个好东西.在团队规模有限的情况下用这个是非常的的.当然也可以用node.js 开发聊天. linux 下面有几个要注意的地方. 因为我选择的CentOS 6是64位的了,然而Openfire却是32位的,因此必须要安装32位的C++运行时.如果服务器能够访问外网,那么执行 openfire 是java 开发的所以需要安装java 注意你的版本. 接下来按照顺序安装 http://www.igniterealtime.org/builds/openfire/docs/lates

资金平台交易明细扩展开发-DEP

前言 支持农垦项目中,需要增加抓取银行接口传输数据,需求有两点:一是银企平台前置机需要增加扩展中行.农行数据字段.(代理账号.代理账户名称.代理银行) 二是EAS资金模块中的交易明细查询列表界面能够显示扩展的上述三个字段数据. 资金模块 交易明细表:T_BE_TransDetail 实体:TransDetail 新增字段 <String 80>:代理账号: agentAccNo 代理账户名称:agentAccName 代理银行名称:agentAccBkName 银企平台与资金平台二者数据关系:

揭秘12306技术改造(三):传统框架云化迁移到内存数据平台

摘要:此篇文章列举不同类型的系统改造迁移到云平台方案,从改造思路探讨,系统框架设计和项目实施的整个迁移过程,供大家参考和交流. 注:本文首发于CSDN,转载请标明出处. [编者按]在年前的「技术揭秘12306改造」专题中,负责12306改造的技术架构师刘云程从技术的角度.用科学论证的方式说明 12306是如何实现高流量高并发的关键技术,以及深入探讨了12306两地三中心混合云架构,今天,他继续为大家带来第三篇:传统框架云化迁移到内存数据平台. 以下为正文>> 摘要 12306混合云成功案例给予

字符流分类详细介绍和各种字符流类介绍与使用 字符集

1.字符流: 字节流不能操作Unicode字符,由于Java采用16位的Unicode字符,即一个字符占16位,所以要使用基于字符的输入输出操作.所以创造了字符流,以提供直接的字符输入输出的支持. 2.字符流类的层次结构: 2.1.输入流的类层次结构: 2.2.输出流的类层次结构 3.字符流的顶层抽象类: Reader和Writer. public abstract class Reader extends Object implements Readable, Closeable 用于读取字符

关于Unicode字符集

关于Unicode字符集 (2011-10-20 20:54:03)   最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符.显然,这样要表示各种语言中所有的字符是远远不够的.Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符. Unicode只是一个编码规范,目前实际实现的unicode编码只要

字符集编码---1 基本概念

“给定一个字符,对应各种字符集编码后的二进制形式到底是什么样子?”,对于这个问题,我自己也不甚清楚.而且日常工作中,每次遇到这个问题都是靠一款叫做 CodeView 的工具解决.所以接下来不涉及具体的编码过程,只对基本概念.各平台下的字符集转换做介绍. 本文为第一部分,对常用字符集编码做概念性介绍.以下是查阅维基百科和牛人博客后,我自己的一种理解,并不一定十分准确.首先,要来理解两个概念: 字符集: 字符与二进制码一一对应的集合. 字符编码: 存储和解析字符集中的二进制码.而不同字符集收录的字符

字符集与字符编码详解

字符 字符和字节不太一样,任何一个文字或符号都是一个字符,但是所占字节不一定,不同的编码导致一个字符所占的内存不同. 例如:标点符号"+"是一个字符,汉字"我们"是两个字符,在GBK编码中一个汉字占2个字节,在UTF-8编码中一个汉字占3个字节. 随着时代的发展,程序员们希望在计算机中显示字符,但计算机只能识别0和1的二进制数.于是就有了编码规范. 编码规范 所谓的字符集其实是一套编码规范中的子概念,为了显示字符,国际组织就指定了编码规范,希望使用不同的二进制数来表

Tibco公司SOA集成平台简介

远行科技做为Tibco公司重要战略合作伙伴和实施商,现对tibco soa 中间件做一个简单介绍. TIBCO集成服务框架(TIBCO Integrated Service Framework,TISF)是基于分布式架构的消息总线技术,遵循SOA设计理念并在其之上提供各种标准及非标准协议支持,以达到简化服务开发.部署及管理并且能实现服务在异构环境的服务共享及服务重复使用. TIBCO集成服务框架具有开放性.可扩展性和高可实施性等特点,能充分支持企业SOA架构业务设计实施的需求.TISF是开放性平