字符集的选择
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. 【NodeJs环境下bower】如何更改bower_components文件夹的位置

    bower在初始化,默认是将bower_components文件夹放到项目的根目录下,若是public/index.html如何配置bower_components下的js或者css类库呢?只需要将b ...

  2. Touch ID 实现

    Touch ID 1.要求 机型:iPhone 5s以上 系统:iOS8以上 框架:#import <LocalAuthentication/LocalAuthentication.h> ...

  3. 如何在eclipse中通过Juit进行单元测试

    1.什么是Junit Junit即单元测试,是JAVA语言的单元测试框架,是对程序的一个方法所进行的测试 一般都是由程序员自己通过Junit来进行测试,因此单元测试也叫程序员测试: 如果测试人员熟悉程 ...

  4. context:component-scan标签的use-default-filters属性的作用以及原理分析

    一.背景 我们在Spring+SpringMVC+Mybatis的集成开发中,经常会遇到事务配置不起作用等问题,那么本文就来分析下出现这种问题可能的原因以及解决方式. 二.分析及原理窥探 1.项目结构 ...

  5. Ubuntu和Win双系统解决主板时间差

    由于U和W两个系统的默认时间相差8小时,且会自动改变电脑主板里的默认时间,需要在U中进行设置. timedatectl set-local-rtc true

  6. STL string的构造函数

    前几天在网上,一位网友问我几个问题如下: , 'A'); string S1 = "abcdefg"; , ); ); cout << "s0 = " ...

  7. thinkphp 3.2.3 session 丟失問題

    之前做的几个 站session在跨页时也不会丢失(都在同一台服务器,所以我排除了服务器配置问题),这次居然很奇怪的发生的,在火狐上有,在ie, 谷哥上没有session,看了很多网上的贴子 其中有一个 ...

  8. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  9. [转]js实现各种进制的转换

    关键点: parseInt(string, radix).toString(target_radix); 参考:http://www.cnblogs.com/guowei1027/archive/20 ...

  10. .NET Remoting 应用实例

    前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...