字符集的选择
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. window下安装anaconda ipython和spyder都打不开

    1. 环境 win7 64位,软件是Anaconda2-4.1.1-Windows-x86_64.exe 2. 出现的问题 ipython打不开,一闪而过 spyder点击没有反应 anaconda ...

  2. ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

    当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...

  3. 模拟搭建Web项目的真实运行环境(六)

    今天把Redis和Mongodb的操作整理一下,方便日后自己查看,废话不多说,直接进入主题. 一.Redis 1. 引用StackExchange.Redis.dll 由于ServiceStack.R ...

  4. js如何求一组数中的极值

    这是一个很简单的问题,现在我们从循环开始,例如一组数[5,2,1,3,4];求其中的最大值,那么首先我们要定义一个max的中间变量,遍历数组,当遇到比max值大则赋值给max,直到循环结束,就能获取这 ...

  5. Js 日期 多少分钟前,多少秒前

    ;(function(window){ /** * [dateDiff 算时间差] * @param {[type=Number]} hisTime [历史时间戳,必传] * @param {[typ ...

  6. PHP中的date()函数

    d  月份中的第几天,有前导零的 2 位数字 01 到 31 D  星期中的第几天,文本表示,3 个字母 Mon 到 Sun j  月份中的第几天,没有前导零 1 到 31 l  ("L&q ...

  7. sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...

  8. 【leetcode】Remove Duplicates from Sorted List

    题目简述 Given a sorted linked list, delete all duplicates such that each element appear only once. For ...

  9. PROC 文件系统调节参数介绍(netstat -us)

    转自:http://www.cnblogs.com/super-king/p/3296333.html /proc/net/* snmp文件 Ip: ip项 Forwarding        : 是 ...

  10. mysql基本信息收集

    1.下载安装 percona-toolkit 工具包http://www.percona.com/downloads/percona-toolkit/LATEST/tarball/2.运行下面两个工具 ...