字符集的选择
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字符集
首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则.这两个参数集可以在数据库实例.单个 ...
- Mysql字符集设置
转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...
- mysql5.5字符集设置的一点变化(对于中文乱码问题,需要设置mysql字符集)
工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ...
- Mysql字符集知识总结
字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...
- MySQL字符集的修改和查看
1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集 ...
- MySQL字符集转换引发插入乱码问题
根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...
- MySQL 字符集设置
/*************************************************************************** * MySQL 字符集设置 * 说明: * 数 ...
- [MySQL] 字符集的选择
1. Mysql支持的字符集 MySQL服务器可以支持多种字符集,不同的字段都可以使用不同的字符集. 查看所有可用字符集: show character set; select * from info ...
- Mysql字符集设置 2 图
基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodin ...
随机推荐
- jdbcTemplate批量插入(添加)
public void addSubscibe(List<PermedipUserSubscribeVo> list) { final List<PermedipUserSubscr ...
- SQLite.Net-PCLUSING SQLITE IN WINDOWS 10 UNIVERSAL APPS
USING SQLITE IN WINDOWS 10 UNIVERSAL APPS 1.下载SQLite VSIX package并安装 http://sqlite.org/download.html ...
- GitHub Desktop+码云(GIT.oschina)使用方法
一.如何从码云GIT导入到GitHubDeskTop桌面工具. 1.先用命令行切换到本地的目录. 2.使用git clone 码云GIT地址 命令将项目克隆到本地. 3.在GitHub Desktop ...
- 可视化日历_Java实现
//刚刚学Java,写的小程序 package cn.xiaocangtian.testDate; import java.text.DateFormat; import java.text.Pars ...
- Swift - 键盘弹起,遮挡输入框
extension LoginViewController:UITextFieldDelegate { func textFieldShouldReturn(textField: UITextFiel ...
- mvc学习中的问题汇总
问题1:更新条目时出错.有关详细信息,请参阅内部异常. 初学MVC,正好手上有别人搭建的一个框架.于是直接用了起来.一切似乎都很顺利. 列表页也正常读取了.可是在新增数据时,始终报如上的错.即使用了调 ...
- 【转】PHP的Trait 特性
Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情 ...
- 改变linux默认配色方案(dircolors和dircolors-solarized使用)
前言 前几天刚买了阿里云的云服务器,今天使用putty进入服务器,发现linux默认的bash配色实在太丑. 特别是文件夹显示为深蓝色,到了白天,和黑色背景一搭配,根本看不清文字. 好在在github ...
- Flex Layout Attribute
GitHub: https://github.com/StefanKovac/flex-layout-attribute 引入基本的样式,可以更好的布局,可以在线制作: http://progress ...
- webrtc中APM(AudioProcessing module)的使用2
这个其实就是从Audio_processing.h中拿出来的. APM should be placed in the signal chain as close to the audio hardw ...