计算机能够直接识别并处理的只有二进制数据。
在计算机中,二进制的每个0
或者每个1
都占1个二进制位(bit),由于1个二进制位只能表示0
或1
中的某1个,也就只能表示2种可能性,不足以满足常规使用,所以,就设计了**字节(byte)**这种单位,每1个字节占8个二进制位,同时,字节是计算机中最基础的存储单位。
二进制是计算机必须使用的语言,而人类生活却很难适应或使用二进制,所以,早期就制定ASCII码表,在这个表中,就记录了字母、数字、符号等与二进制数据的对应关系,例如字母a
对应的就是110 0001
,也就说,当人类需要表达a
时,计算机会将其转换为110 0001
再进行处理,反之,当计算机处理数据后得到110 0001
也会转换成a
来显示或通过其它方式提供给人类使用,所以,这种码表其实就是记录了人类生活使用的符号与计算机能处理的二进制数据的对应关系,相当于“字典”。
ASCII码表只记录了1个字节的对应关系,所以,不足以满足中文的使用需求,如果要使用中文,至少需要2个字节!
常见的支持中文的编码有:GB2312,GBK,UTF-8等。
在Java语言中,是使用Unicode编码的。
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
在传输过程中,如果使用Unicode编码,会导致发送与接收可能不统一的问题,例如,可以使用1个字节表示某个字母,使用2个字节表示某个汉字,如果发送方要发出2个汉字,实际就会发出4个字节,而接收方却很难明确收到的这4个字节到底是2个汉字,还是4个字母,或1汉字2字母,或2字母1汉字,或1字母1汉字1字母。所以,为了保证数据传输,就设计UTF系列编码。
UTF,是Unicode Transformation Format的缩写,意为Unicode转换格式。
以UTF-8编码为例,它在Unicode编码的基础之上,在特定的二进制位使用特定的0
或1
,以表示特定的含义,并不是编码的意义!在UTF-8中,如果使用2个字节表示1个字符,其格式固定为:
110 xxxxx 10 xxxxxx
如果使用3个字节表示1个字符,其格式固定为:
代码语言:javascript复制1110 xxxx 10 xxxxxx 10 xxxxxx
甚至,在UTF-8中,还可以使用4个字节表示1个字符,其格式固定为:
代码语言:javascript复制11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx
可以看到,UTF-8编码最多可以使用4个字节表示1个字符,其实,常规使用的字符(全世界各国家、各民族使用的字符)使用3个字节就够了,必须使用4个字节才能表示的都是一些使用频率极低的符号。
在MySQL数据库中,将UTF-8编码细分为了utf8mb3
和utf8mb4
(mb
= most byte
),当设置为utf8
时,等效于设置为utf8mb3
。
目前主流的开发模式中,推荐将数据库/数据表的编码设置为utf8mb4
。
注意:较低版本的MySQL并不识别utf8mb4
。