最近一直在研究MYSQL的字符集问题,发现问题并不简单,所以有必要深究一番。

utf8_unicode_ci PK 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,因为它比较准确。

总结:

utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。

utf8_general_ci校对速度快,但准确度稍差。

utf8_unicode_ci准确度高,但校对速度稍慢

2.字符集

字符集和校对规则

字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。

MySql在collation提供较强的支持,oracel在这方面没查到相应的资料。

不同字符集有不同的校对规则,命名约定:以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束

校对规则一般分为两类:

binary collation,二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中'A'和'a'的编码显然不同。

字符集_语言名,utf8默认校对规则是utf8_general_ci

mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。

具体来说,我们系统使用的是utf8字符集,如果使用utf8_bin校对规则执行sql查询时区分大小写,使用utf8_general_ci 不区分大小写。不要使用utf8_unicode_ci。

如create database demo CHARACTER SET utf8; 默认校对规则是utf8_general_ci 。

Unicode与UTF8

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.

UTF8字符集是存储Unicode数据的一种可选方法。mysql同时支持另一种实现ucs2。

详细说明

字符集(charset):是一套符号和编码。

校对规则(collation):是在字符集内用于比较字符的一套规则,比如定义'A'

每个字符集有一个或多个校对规则,并且每个校对规则只能属于一个字符集。

binary collation,二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中'A'和'a'的编码显然不同。除此以外,还有更加复杂的比较规则,这些规则在简单的二元法之上增加一些额外的规定,比较就更加复杂了。

mysql5.1在字符集和校对规则的使用比其它大多数数据库管理系统超前许多,可以在任何级别进行使用和设置,为了有效地使用这些功能,你需要了解哪些字符集和 校对规则是可用的,怎样改变默认值,以及它们怎样影响字符操作符和字符串函数的行为。

校对规则一般有这些特征:

两个不同的字符集不能有相同的校对规则。

每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci。

存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束

确定默认字符集和校对

字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。

数据库字符集和校对

每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:

例如:

CREATE DATABASE db_name DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

MySQL这样选择数据库字符集和数据库校对规则:

· 如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校对规则Y。

· 如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。

· 否则,采用服务器字符集和服务器校对规则。

在SQL语句中使用COLLATE

•使用COLLATE子句,能够为一个比较覆盖任何默认校对规则。COLLATE可以用于多种SQL语句中。

使用WHERE:

select * from pro_product where product_code='ABcdefg' collate utf8_general_ci

Unicode与UTF8

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.Unicode码可以采用UCS-2格式直接存储.mysql支持ucs2字符集。

UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。

UTF8字符集(转换Unicode表示)是存储Unicode数据的一种可选方法。它根据RFC 3629执行。UTF8字符集的思想是不同Unicode字符采用变长字节序列编码:

· 基本拉丁字母、数字和标点符号使用一个字节。

· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。

· 韩语、中文和日本象形文字使用三个字节序列

来自:用梦想丈量人生,用奔跑丈量激情

校对集

MySQL5.5.8中共有字符集39,校对集195个

#显示所有的校对集

Show collation

#显示所有的字符集

show character set

所以一个字符集对应多个校对集,即同样的一个字符集有多重排序规则

比如一个utf8的字符集共有22中排序规则

3.character_set和collation

MySql:charset和collation的设置

charset 和 collation 有多个级别的设置:服务器级、数据库级、表级、列级和连接级

www.2cto.com

1.服务器级

查看设置:show global variables like 'character_set_server'; 和 show global variables like 'collation_server';

修改设置:在OPTION FILE (/etc/mysql/my.cnf)里设置:

[mysqld]

character_set_server=utf8

collation_server=utf8_general_ci

2. 数据库级

查看设置:select * from information_schema.schemata where schema_name = 'cookbook';

设置:

1.若没有显式设置,则自动使用服务器级的配置

2.显式设置:在创建库时指定

create database playUtf8  DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

www.2cto.com

3.表级

查看设置:show create table course;

设置:

1.若没有显式设置,则自动使用数据库级的配置

2.显式设置:在创建表时指定

create table utf ( id int ) default charset=utf8 default collate=utf8_bin;

4.列级

查看设置:show create table course;

设置:

1.若没有显式设置,则自动使用表级的配置

2.显式设置:

CREATE TABLE Table1(column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci);

5.连接级别

查看设置:

show variables like 'character_set_client';  # 服务端使用这个编码来理解客户端发来的statements

show variables like 'character_set_connection' ; # 我还不知道什么意思,等看了mysql源码再说

show variables like 'character_set_results'; # 服务端使用这个编码回送结果集和错误信息

设置:

客户端在连接时可以指定这些参数;同时,服务端也提供了一个Global范围的值,客户端未指定这些参数时,服务端就使用这个Global值。这个global值怎么设置的? 我查遍了很多文档,似乎还没看到设置的办法 (有人说通过my.cnf,或者在启动mysqld时指定命令行参数,其实都是错的)

附:connector/j传输SQL时用什么编码?

答案: "The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server using the character_set_server system variable for server versions 4.1.0 and newer."

也就是说,是在连接时查询服务器端的character_set_server值,再确定连接将使用的编码。

不过,官方文档还说,"要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。"

mysql 5.166修改字符集_mysql字符集问题相关推荐

  1. mysql批量修改字段字符集_MySQL字符集修改实战教程

    前言: 在 MySQL 中,系统支持诸多字符集,不同字符集之间也略有区别.目前最常用的字符集应该是 utf8 和 utf8mb4 了,相比于 utf8 ,utf8mb4 支持存储 emoji 表情,使 ...

  2. mysql gbk字符集_Mysql字符集知识总结

    字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...

  3. mysql文字字符集_MySQL字符集

    字符集 1.什么是字符集 #字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 最早的字符集:ASCII码 中国的字符集:gbk,ut ...

  4. mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解

    MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...

  5. mysql图片字符集_MySQL字符集介绍及配置

    1.MySQL编码集 查看MySQL支持的字符集 mysql> show character set; 查看MySQL当前的字符集 mysql> show variables like ' ...

  6. mysql 所有字符集_mysql字符集

    mysql字符集 字符集基础 字符集:数据库中的字符集包含两层含义 各种文字和符号的集合,包括各国家文字,标点符号,图形符号,数字等. 字符的编码方式,即二进制数据与字符的映射规则: 字符集分类: A ...

  7. mysql 中日韩 乱码_mysql字符集及乱码问题

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:当 ...

  8. mysql常见字符集_MySQL字符集

    一.字符集介绍 什么是字符集(Charset) 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 1.gbk/gb2312 gbk/ ...

  9. mysql查看当前表字符集_mysql 字符集设置查看

    1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...

  10. MySQL查看及修改字段的字符集

    -- 查看字段的字符集 show full columns from test1; -- 修改字段的字符集 ALTER TABLE tbl_name CHANGE c_name c_name CHAR ...

最新文章

  1. 大脑如何判断该睡觉了?可能是这80种蛋白说了算
  2. Using string literals in ref attributes is deprecated
  3. SWOOLE httpserver
  4. 【linux】tcpdump抓包
  5. 三元运算符运算(Day02)
  6. java hashmap实例,关于java中的HashMap的实例操作
  7. VGA光端机技术原理及应用领域介绍
  8. import qs from qs 安装_Python 导包难道你只会个 import 吗?
  9. Linux内核 eBPF基础:perf(4)perf_event_open系统调用与用户手册详解
  10. Oracle 已命名的异常
  11. 用ZK UI解决storm 读取Kafka时的Fetch offset *** is out of range for topic , resetting offset
  12. B样条曲线(B-spline Curves)
  13. 微信小程序转发朋友圈
  14. 中观到底有没有立宗?
  15. python中数字转英文_python:将数字转换成用英文表达的程序
  16. ParrotSec 中文社区 QQ群认证 Openssl解密
  17. python爬虫学习(循环爬取网页链接)
  18. Caused by: org.xml.sax.SAXParseException;必须为元素类型 mapping 声明属性 resourse。
  19. amoled led 排列_AMOLED屏幕为啥不用RGB排列?
  20. 祝学校计算机系的新年贺词,新年祝福语:学校新年贺词祝福短信

热门文章

  1. 模板方法模式---榨汁机
  2. XPath解析中的 'Element a at 0x5308a80'是什么
  3. CentOS7用YUM方式安装MySQL5.7
  4. 【DSP学习笔记】定点DSP小数乘加计算
  5. 领导提拔你,还是干掉你,从来都不是看能力!
  6. 用户态和内核态的切换耗费时间的原因
  7. 论文精读-基于双目图像的视差估计方法研究以及实现
  8. Linux中计算特定CPU使用率
  9. 2022面试经验分享(非技术)
  10. 计算机组成原理_存储系统结构