字符集的选择
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 ...
随机推荐
- MAC 常用命令
杀死占用某个端口的进程 命令 lsof -i tcp:port port换成端口号可以查看端口是被哪个程序占用 --> kill -9 pid 杀死进程
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
在WWDC 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App].虽然它不是一个必须实现的功能, 但还是需要引起一些注意. 在 ...
- Aspx页面模拟WebService功能
在后台引入 using System.Web.Services 命名空间 然后在编写web服务方法: [WebMethod] public static string GetData(string t ...
- RSA密钥之C#格式与Java格式转换
前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...
- Xcode 突然有部分文件不显示
今天突然Xcode抽风了,突然我的项目中的文件好多不显示出来,本地文件夹都有,见鬼了..... 真心坑死了,于是乎就找度娘了,果然被我发现了 看见这个蓝色小时钟没呀,就是他在捣鬼,我点击一下变成灰色就 ...
- [算法总结]partition (quicksort)
private int partition(int[] nums, int lo, int hi) { if (lo >= hi) { return lo; } int i = lo; int ...
- Nginx配置文件nginx.conf中文详解
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...
- 【Hawk】入门教程(1)——从URL开始
入门教程(1)--从URL开始 首先感谢辛苦的沙漠君 先把沙漠君的教程载过来:)可以先看一遍 Hawk-数据抓取工具:简明教程 Hawk 数据抓取工具 使用说明(二) 20分钟无编程抓取大众点评17万 ...
- tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)
配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...
- 基于dubbo构建分布式项目与服务模块
关于分布式服务架构的背景和需求可查阅http://dubbo.io/.不同于传统的单工程项目,本文主要学习如何通过maven和dubbo将构建分布项目以及服务模块,下面直接开始. 创建项目以及模块 ...