文档章节

Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

dinggosumsung
 dinggosumsung
发布于 2016/07/05 23:17
字数 1603
阅读 5
收藏 0
点赞 0
评论 0

用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别。。
ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;
bin 是二进制, a 和 A 会别区别对待.
例如你运行:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容

一、官方文档说明
下面摘录一下Mysql 5.1中文手册中关于utf8_unicode_ci与utf8_general_ci的说明:

复制代码 代码如下:


     当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。

 

     utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß'等于‘ss'。

     utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。

     例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:
     Ä = A
     Ö = O
     Ü = U

     两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
     ß = s

     但是,对于utf8_unicode_ci下面等式成立:
     ß = ss

     对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

     utf8_general_ci也适用与德语和法语,除了‘ß'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。


如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束,例如:

复制代码 代码如下:

create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;

 

二、简短总结
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。

如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了,到现在也没发现问题。。。

三、详细总结

1、对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
2、utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

用一句话概况上面这段话:utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了

四、如何在MySQL5.0中使用UTF8
在 my.cnf中增加下列参数

复制代码 代码如下:


[mysqld]
init_connect='SET NAMES utf8′
default-character-set=utf8
default-collation = utf8_general_ci

 

执行查询 mysql> show variables; 相关如下:

复制代码 代码如下:

character_set_client | utf8
character_set_connection | utf8
character_set_database | utf8
character_set_results | utf8
character_set_server | utf8
character_set_system | utf8

 

collation_connection | utf8_general_ci
collation_database | utf8_general_ci
collation_server | utf8_general_ci

 

个人见解,对于数据库的使用,utf8 - general 已经足够的准确,并且相较与  utf8 - unicode速度上有优势,固可放心采用之


附1:旧数据升级办法
以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:导出旧数据

复制代码 代码如下:

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql


第二步:转换编码(类似unix/linux环境下)

复制代码 代码如下:

iconv -t utf-8 -f gb2312 -c old.sql > new.sql


或者可以去掉 -f 参数,让iconv自动判断原来的字符集

复制代码 代码如下:

iconv -t utf-8 -c old.sql > new.sql


在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改old.sql,在插入/更新语句开始之前,增加一条sql语句: "SET NAMES utf8;",保存。

复制代码 代码如下:

mysql -hlocalhost -uroot my_db < new.sql


大功告成!!

 

附2:支持查看utf8字符集的MySQL客户端有
1.) MySQL-Front,据说这个项目已经被MySQL AB勒令停止了,不知为何,如果国内还有不少破解版可以下载(不代表我推荐使用破解版 :-P)。
2.) Navicat,另一款非常不错的MySQL客户端,汉化版刚出来,还邀请我试用过,总的来说还是不错的,不过也需要付费。
3.) PhpMyAdmin,开源的php项目,非常好。
4.) Linux下的终端工具(Linux terminal),把终端的字符集设置为utf8,连接到MySQL之后,执行 SET NAMES UTF8; 也能读写utf8数据了。

本文转载自:http://www.jb51.net/article/48775.htm

共有 人打赏支持
dinggosumsung
粉丝 0
博文 30
码字总数 2108
作品 0
中山
utf8_unicode_ci与utf8_general_ci的区别

当前,utf8unicodeci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashk...

微wx笑
2017/04/13
0
0
Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别

utf8unicodeci和utf8generalci对中、英文来说没有实质的差别。 utf8generalci 校对速度快,但准确度稍差。 utf8unicodeci 准确度高,但校对速度稍慢。 如果你的应用有德语、法语或者俄语,请...

模范生
04/19
0
0
MySQL字符集和排序规则解析 MySQL DBA周末学习

MySQL提供了多种字符集和排序规则选择,其中字符集设置和数据存储以及客户端与MySQL实例的交互相关,排序规则和字符串的对比规则相关。 字符集的设置可以在MySQL实例、数据库、表、列四个级别...

zhouzhou2018
05/23
0
0
MySQL字符集与排序规则 北京MySQL DBA学习

  MySQL提供了多种字符集和排序规则选择,其中字符集设置和数据存储以及客户端与MySQL实例的交互相关,排序规则和字符串的对比规则相关。   字符集的设置可以在MySQL实例、数据库、表、列...

mo默瑶
05/23
0
0
解释DEFAULT CHARACTER SET utf8 COLLATE utf8_general_

在创建数据库的时候,经常用到一句: CREATE DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8generalci 具体意思不太明白,经查阅一番,总结如下:   CREATE DATABASE :创建数据库tpc...

Amamatthew
2014/09/26
0
0
mysql 数据库常用命令

utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 因为 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了 保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 ...

冰山剑客
2017/05/02
0
0
Python&MySQL操作过程中遇到的编码问题

对于Python字符编码的理解 之前整理了一部分,这次主要是设计到数据库操作的。 下面是一些编码方面的概念和原理,以条目方式整理: CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET u...

Iuranus
2014/07/14
0
0
MySQL在建表时,选UTF8编码时,你们选的哪种校对规则?

有utf8bin 、utf8generalci 、utf8unicode_ci 等等一大堆,网上搜了,说是unicode更准确,general更快,还有说用bin的。 那你们一般选什么呢?为什么呢? 今天我从SQLite中的UTF8的数据导入到...

倪倪
2014/07/24
3K
8
MySQL 字段内容区分大小写

数据由Oracle 迁入MySQL ,由于之前Oracle区分大小写,MySQL的配置使用了默认配置,导致一些数据导入失败,有的唯一键报错,冲突。 将测试过程记录在下面。 数据库版本:MySQL 5.7.11 引用他...

Amnesiasun
2017/06/01
0
0
Illegal mix of collations (utf8_general_ci,IMPLI

我用的是mysql5.0,执行更新的时候出错,整了半天都弄不好,请大家多多指教! 执行 update users set ev=5000 where username='eye'; 报错 Illegal mix of collations (utf8generalci,IMPLICI...

走啊
2010/08/03
8.9K
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

数据库事务的四大特性以及事务的隔离级别

本篇讲述数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是...

Java大蜗牛
11分钟前
0
0
Spring Boot 整合 MyBatis/通用Mapper/PageHelper分页插件

整合MyBatis 整合通用Mapper 1. POM依赖配置 <properties><mapper.starter.version>2.0.3-beta1</mapper.starter.version></properties><!-- 通用Mapper --><dependency><groupId>t......

OSC_fly
19分钟前
0
0
CentOS7 双网卡绑定

环境 操作系统 CentOS7.5,禁用 NetworkManager 服务 网卡 eth0 网卡 eth1 绑定网卡 bond0 网卡 eth0 配置 修改 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=EthernetBOOTPROTO=noneD......

Colben
21分钟前
0
0
zk实战--rpc框架集群化

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架 前文功能简介以及功能扩充 利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法...

xpbob
37分钟前
11
0
springboot 发送邮件

获取授权码 添加配置 # 账号和密码spring.mail.username=aaa@qq.comspring.mail.password=bbb# 服务器地址spring.mail.host=smtp.qq.comspring.mail.properties.mail.smtp.ssl.en...

阿豪boy
37分钟前
0
0
如何使用GNU Ring?

文章名:如何使用GNU Ring? 作者:冰焰火灵X 1079092922@qq.com 文章许可:CC BY-SA 4.0 ##1. 安装 下载GNU Ring 点击左边选择你的系统版本(这里以 GNU/Linux 为例,我使用的是Mint 18.3)...

ICE冰焰火灵X
40分钟前
4
0
深入理解springMVC

什么是spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而...

Java填坑之路
46分钟前
1
0
《射雕英雄传》书摘

1. 我虽是个飘泊江湖的贫家女子,可不是低三下四、不知自爱之人。你如真心爱我,须当敬我重我。我此生决无别念,就是钢刀架颈,也决意跟定了你。将来……将来如有洞房花烛之日,自然……自能...

k91191
56分钟前
1
0
解决:modal中datePicker 选中时,会触发modal的hidden.bs.modal事件

最近项目中发现了一个bug,具体表现为选中模态框上datepicker组件上的日期时,会触发模态框的关闭事件,导致数据编辑无法正常进行。网上搜索了下,解决方法如下: $('.datepicker').on('hid...

Funcy1122
今天
0
0
Redis分布式锁的正确实现方式

前言 分布式锁一般有三种实现方式: 1.数据库乐观锁 2.基于Redis的分布式锁; 3.基于Zookeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis...

大海201506
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部