java
机器只知道字节,而字符却是语义上的单位,它是有编码的,一个字符可能编码成1个2个甚至3个4个字节。这跟字符集编码有关系,英文字母和数字是单字节,但汉字这些自然语言中的字符是多字节的。一个字节只能表示255个字符,不可能用于全球那么多种自然语言的处理,因此肯定需要多字节的存储方式。那么在文件的输入输出中,InputStream、OutputStream它们是处理字节流的,就是说假设所有东西都是二进制的字节;而 Reader, Writer 则是字符流,它涉及到字符集的问题;按照ANSI编码标准,标点符号、数字、大小写字母都占一个字节,汉字占2个字节。按照UNICODE标准所有字符都占2个字节。
英文字母和数字:
字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:ISO-8859-1
字节数 : 1;编码:UTF-8
中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 1;编码:ISO-8859-1
字节数 : 3;编码:UTF-8
MySql 5.0 以上的版本:
1、一个汉字占多少长度与编码有关:
UTF-8:一个汉字 = 3个字节,英文是一个字节
GBK: 一个汉字 = 2个字节,英文是一个字节
2、varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。
3、MySQL检查长度,可用SQL语言 SELECT LENGTH(fieldname) FROM tablename 这个命令可以看到各行使用的字节数。
mysql版本5.6.32-78.0下面用实际例子来说明问题:
1. 首先创建一张临时用表:
create TEMPORARY table medivac( name VARCHAR(10) ); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
2. 插入一些数据:
INSERT INTO medivac (name) VALUES ('' at line 1 mysql> INSERT INTO medivac (name) VALUES ('a'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('哈'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('\U+1F604'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'); Query OK, 1 row affected, 1 warning (0.00 sec)
3. 查看表中数据:
mysql> select * from medivac -> ; +--------------------------------+ | name | +--------------------------------+ | a | | 哈 | | ? | | 哈哈哈哈哈哈哈哈哈哈 | +--------------------------------+
4. 查看占用字节数:
+--------------+ | length(name) | +--------------+ | 1 | | 3 | | 4 | | 30 | +--------------+
mysql总结:
1. 一个varchar存汉字需要使用三个字段在utf8和utf8mb4编码表的情况下。
2. 如果需要存储emoji表情的需求,新表的默认编码方式应该写为utf8mb4。另外提一点在最新发布的mysql8.0里面,默认编码方式已经是utf8mb4了。
3. 在utf8和utf8mb4中 varchar(n)这个n是字符,所见即所得,一个a是一个字符一个?也是一个字符 不过就是a这个字符是1个字节 哈这个字符是3个字节 而?这个字符是4个字节表示罢了