中文在gb2312编码的时候是2字节,但在unicode编码的 情况下是1-3字节不等,英文则都是1字节,但在mysql中不做这方面的设定,varchar的长度不管是中文和英文都是一格字算一个,那么。。为什么要做这个1个汉字相当于2个英文字符的设定?
回复内容: 中文在gb2312编码的时候是2字节,但在unicode编码的 情况下是1-3字节不等,英文则都是1字节,但在mysql中不做这方面的设定,varchar的长度不管是中文和英文都是一格字算一个,那么。。为什么要做这个1个汉字相当于2个英文字符的设定?
http://xfhnever.com/blog/2014/12/20/encodingformat/ 中稍微介绍了一下各种编码格式
varchar(20)指定的是字符长度
mysql中会指定表的字符集,如下面的charset=gbk:
create table `test_type` ( `id` int(10) unsigned not null auto_increment, primary key (`id`),) engine=innodb auto_increment=7 default charset=gbk collate=gbk_bin
为什么要做这个1个汉字相当于2个英文字符的设定?
这种设定是一般基于字符串的自然长度(也就是显示的长度), 一个汉字等于2个英文字母或数字。对于普通用户来讲就是字样,计算字节一般不都是程序和程序员干的事么。所以一般的程序设计中,一般遵循着一个汉字就是2个英文字母长度的设定,而具体占用空间则视编码和环境进行计算。
参建函数 mb_strwidth()
最早出现的编码是ascii这样面向英文语言的编码,ascii定义了0-127,一共128个字符的编码。对于英语这样用26个字符的,自然是够用的。问题是,如果是其他使用的字符多余26个的西方文字呢?由于已经约定了0x7f空间内的字符编码,所以我们可以看到有些西方文字,例如俄文是完全不和英文共用部分字符的,需要使用ascii扩展集。在编码理论发展的过程,出现过各个地域分别采用不同编码体系来编码本国文字。中国是使用iso2022体系,编码了中国的常用字符gb2312,更多的字符gbk,以及最大的集合gb18030。
通过简单的思考,你会发觉一个字节8bits只能编码类似英文这样的文字系统,而中文的常用字就有几千上万个。所以至少需要2个字节。
unicode的出现,目的是统一全世界所有的字符编码空间,不会造成字符编码冲突问题。例如,如果你用gbk编码的字符,用utf-8编码解释,也可能是字面有效的。unicode编码有utf-8,utf-16,utf-32,甚至utf-7等多种格式。常说的unicode编码是指utf-16,因为它能以统一的方式编码几乎所有常用的字符,所以如果不是针对极端情况,我们可以假设字符都能用utf-16表示。在utf-16编码的情况下,汉字和英文每个字符的长度都是2个字节,是等长的。在windows系统内部就是利用这种特性,高效的处理文字。utf-8应用也很广泛,好处是存储上来说空间节省,解码复杂些。
mysql在多个层面上都做了encoding的设计,支持在不同层面上指定字符编码。
不过显然,我们应该推荐在各个层面是使用utf-8编码。如果是内存中处理,推荐使用utf-16,其实各种语言在设计中,好像也是这样设计的。