字符集的选择
1.如果数据库只需要支持中文,数据量很大,性能要求也很高,应该选择双字节定长编码的中文字符集(如GBK)。因为相对于UTF-8而言,GBK"较小",每个汉字只占2个字节,UTF-8的汉字占3个字节。这样可以减少磁盘I/O、数据库Cache以及网络传输的时间,从而提高性能。
如果主要处理英文字符,仅有少量汉字数据,选择UTF-8更好,因为GBK等英文字符编码都是2字节,会造成很多不必要的开销。
2.如果数据库需要做大量的字符运算,如比较、排序等,选择定长字符集更好。因为定长字符集处理速度比变长字符集速度快。
3.如果所有客户端都支持某一个字符集,则应该选择这个字符集作为数据库字符集。因为这样可以避免因为字符集转换带来的性能开销和数据损失。
 
支持的字符集
查看所有可用的字符集
show character set;
查看所有字符集和该字符集默认的校对规则
desc information_schema.character_sets;
查看相关字符集的校对规则
show collation like  'gbk%';
 
校对规则命名
_ci(大小写不敏感)
_cs(大小写敏感)
_bin(基于字符编码的值,与language无关)
 
测试'A'和'a'在_ci和_bin下是否相同
select case when 'A' collate gbk_chinese_ci = 'a' collate gbk_chinese_ci then 1 else 0 end;
select case when 'A' collate gbk_bin = 'a' collate gbk_bin then 1 else 0 end;
 
MySQL字符集的设置
MySQL字符集和校对规则有4个级别的默认设置:1.服务器级 2.数据库级 3.表级 4.字段级
 
[服务器级]
在MySQL服务启动时确定:
1.在my.cnf中设置
character-set-server=gbk
2.在启动选项中指定
mysqld --character-set-server=gbk
3.在编译时指定
shell>cmake .  -DDEFAULT_CHARSET=gbk
 
如果没有特别指定服务器字符集,则默认使用latin1作为服务器字符集。
如果没有指定校对规则,则使用字符集的默认校对规则。
 
查询当前服务器字符集和校对规则
show variables like 'character_set_server';
show variables like 'collation_server';
 
[数据库级]
数据库字符集的规则:
1.指定字符集没有指定校对规则,则使用字符集的默认校对规则。
2.指定校对规则但未指定字符集,则使用与校对规则相关联的字符集。
3.都未指定,则使用服务器级字符集和校对规则。
显示当前数据库字符集
show variables like 'character_set_database';
show variables like 'collation_database';
修改数据库的字符集和校对规则
alter datebase 数据库名 default character set 字符集 [collate 校对规则]
 
[表级]
显示表的字符集和校对规则
show create table 表名;
修改表的字符集和校对规则
alter table 表名 default character set 字符集 [collate 校对规则]
 
[字段级]
修改字段的字符集和校对规则
alter table 表名 change 字段名 字段新名 字段类型 character set 字符集 [collate 校对规则]
修改一张表中所有字段的字符集
alter table 表名 convert to character set 字符集 [collate 校对规则];
显示字段的字符集和校对规则
show full columns from 表名;
定义字段索引时,需要在索引后加个逗号,不然会引起语法错误。
alter table t1 change name name varchar(255)  not null,default character set utf8;
 
连接字符集和校对规则
对于服务器和客户端的交互操作,MySQL提供了三个不同的参数:character_set_client,character_set_connection和character_set_results,分别代表客户端、连接和返回结果的字符集。
通常情况下,这三个字符集应该是相同的,才可以保证用户写入的记录刻意正确地读出。
设置连接的字符集和校对规则,同时修改这3个参数的值
set names 字符集
在my.cnf中设置字符集(在服务启动后,所有连接默认使用GBK字符集进行连接,而不需要执行set names gbk)
[mysql]
default-character-set=gbk
强制字符串的字符集和校对规则
[_字符集]'string'[collate 校对规则]
eg:
select _gbk '字符集'; 
 
字符集的修改步骤
将latin1改成gbk
1.导出表结构。
mysqldump -uroot -p --default-character-set=gbk -d databasename>createtab.sql
 
--default-character-set=gbk :表示设置以什么字符集连接
-d :只导出表结构,不导出数据
 
2.手工修改createtab.sql中表结构定义中的字符集为新的字符集。
3.确保记录不再更新,导出所有记录。
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql
4.打开data.sql,将set names latin1 修改成 set names gbk。
5.使用新的字符集创建新的数据库
create database databasename default charset gbk;
6.创建表,执行createtab.sql
mysql -uroot -p databasename<createtab.sql
7.导入数据,执行data.sql
mysql -uroot -p databasename<data.sql
 
--quick :该选项用于转储大的表。
--extended-insert :使用包括几个values 列表中的多行insert 语法。这样使转储文件更小,重载文件时可以加速插入。
--no-create-info :不导出每个转储表的create table 语句
--default-character-set=latin1 :按照原有的字符集导出所有数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。
 
 
1 row(s) affected, 1 warning(s): 1366 Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'content' at row 1    0.078 sec
产生错误的原因:
1.创建数据库和数据表的时候未声明字符集,所以使用了“默认字符集latin1”,在插入含有中文数据时产生警告。该数据会正常插入,但中文会保存为乱码。
2.使用alter datadase character set... 或者alter table tablename character set ...修改数据库或数据表编码。
这两条语句无法影响字段本身的编码,所以字段依然是latin1编码。
解决的办法:
1.用"alter table 表名 change 字段名 字段新名 字段类型 character set 字符集 [collate 校对规则] "来修改字段的字符集。
2.修改数据表的字符集,删除旧字段,然后新建字段,这时新建的字段就是修改后的数据表字符集。
3.修改数据表的字符集, 但是原来的字段还是latin1字符集。使用方法1修改字段字符集。

MySQL字符集的更多相关文章

  1. 如何修改MySQL字符集

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

  2. Mysql字符集设置

    转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...

  3. mysql5.5字符集设置的一点变化(对于中文乱码问题,需要设置mysql字符集)

    工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ...

  4. Mysql字符集知识总结

    字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...

  5. MySQL字符集的修改和查看

    1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集 ...

  6. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  7. MySQL 字符集设置

    /*************************************************************************** * MySQL 字符集设置 * 说明: * 数 ...

  8. [MySQL] 字符集的选择

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

  9. Mysql字符集设置 2 图

    基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodin ...

随机推荐

  1. Java基础高级二(多线程)

    1.进程和线程的区别:线程是轻量级的,本省不会持太多资源,需要的时候向进程申请 2.线程的状态:创建,可执行,执行中,等待,休眠,阻塞 3.线程状态之间的转换 4.线程API:Thread类,Runn ...

  2. [不断更新]iOS开发常用技术

    1.修改默认初始化方法 构建便利构造器 修改默认init初始化 .m文件中 @implementation 类名 -(id)init{ self=[super init]; printf(" ...

  3. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  4. WPF直接用Window.Close直接关闭窗口导致不能完全退出的问题

    前几天我在CSDN扔了一个问题,基本描述一下:写了一段这样的代码,来实现获取Control的template,却发现一个这样的问题,就是当我打开了一个window以后,手动调用Close(),窗口的确 ...

  5. 常用类string的用法

    在Java中string是我们用的很多的一种类,下面就来说说string类中经常用到的一些方法. 1.string与数组相关的方法: 比如:string str = "fsafdsafdas ...

  6. sublime text3 前端插件介绍

    Emmet插件 Emmet插件可以说是使用Sublime Text进行前端开发必不可少的插件 它让编写HTML代码变得极其简单高效 基本用法:输入标签简写形式,然后按Tab键 关于Emmet的更多介绍 ...

  7. 请慎用java的File#renameTo(File)方法

    转载地址:http://xiaoych.iteye.com/blog/149328 以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名.移 ...

  8. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  9. 【React】启动dva脚手架

    开始前: 确保node版本为6.5以上. // 安装脚手架 npm i dva-cli -g // 自动安装新工程 dva new newProjectName // 导入antd包 npm i an ...

  10. 【leetcode】Path Sum

    题目简述: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding ...