mysql中的字符和字节

只是我回首来时路的每一步都走的好孤独。

1.一个汉字占多少长度与编码有关:

  • UTF-8:一个汉字=3个字节
  • GBK:一个汉字=2个字节

2.varchar(n)表示n个字符,无论汉字和英文,MySQL都能存入n个字符,仅是实际字节长度有所区别

php 把一个汉字认作几个字节:

1
2
3
<?php
$str='我';
echo strlen($str); // 3

输出 3,UTF-8编码下, 一个汉字被认作3个字节长度.

1
2
3
<?php
$str='我';
echo mb_strlen($str); // 1

整型

tinyint

占用一个字节(B), 8位(b)
有符号: -2的7次方(-128) - +2的7次方-1(127)
无符号: 0 - +2的8次方-1(255)

smallint

占用二个字节(B), 16位(b)
有符号: -2的15次方(-32768) - +2的15次方-1(32767)
无符号: 0 - +2的16次方-1(65535)

mediumint

占用三个字节(B), 24位(b)
有符号: -2的15次方(-32768) - +2的15次方-1(32767)
无符号: 0 - +2的16次方-1(65535)

int

占用四个字节(B), 32位(b)
有符号: -2的31次方 - +2的31次方-1
无符号: 0 - +2的32次方-1

bigint

占用八个字节(B), 64位(b)
有符号: -2的63次方 - +2的63次方-1
无符号: 0 - +2的64次方-1

重要说明:我们设计表所填的位数并不会影响到他所能存储的数值的大小,但是会影响到他所填充0 的效果
除了无符号(UNSIGNED)类型属性, 还有一个填充零(ZEROFILL)。 就是类型后面的位宽:
TINYINT(M)中的 M。如果这里的 M 是 3,那么默认显示三个数字,不足在其前面用零填充。
并且,这里的 M 和 TINYINT 中的最大值位数毫无关系,M 设置成 5 也可以。
如果你直接设置 ZEROFILL 属性,那么 UNSIGNED 属性也会自动被勾选,因为填充零的
首要条件就是无符号。填充零只是在显示的时候查看,而 MySQL 内部存储的还是没有填充
的数值。在 Navicat 中,设置了 ZEROFILL 属性也看不到填充的零,为了方便查阅,但在
MySQL 终端和 PHP 查询中,可以看到填充零。

字符串类型

char(2) 和 varchar(2) 都能存储 2个汉字,或者是两个英文字符.