MySQL 数据值和列类型

MySQL 数据值和列类型数据值和列类型 1 数值型整型 整数 非常小的整型 1 字节 0255 无符号 TINYINT 极小的 tiny 较小的整型 2 字节 065535 SMALLINT 小的 small 中

大家好,欢迎来到IT知识分享网。

数据值和列类型

1、数值型

整型(整数)

非常小的整型 1字节 -128–127 0–255(无符号) TINYINT 极小的(tiny)

较小的整型 2字节 -32768–32767 0–65535 SMALLINT 小的(small)

中等大小的整型 3字节 — 0– MEDIUMINT 中等的(medium)

标准的整数型 4字节 —- INT 存储UNIX时间戳(10位或11位)

大整数型 8字节
— BIGINT 大的(big) 存储JAVA时间戳(13位)

整型数据在创建时, 会自动指定数据长度, 如tinyint(4)、mediumint(8)、int(11),

本身并不会校检整型数据的长度, 这个值只有在设置字段类型为zerofill时才会生效。

整数值的显示宽度(例如, INT(4))。该显示宽度规定用于插入的值小于指定的列宽度时从左侧填满宽度。

显示宽度并不限制可以在列内保存的值的范围, 也不限制超过列的指定宽度的值的显示; 而是与zerofill字段属性相结合,否则看不出效果和差别

浮点型(小数)

float(M,D) 4字节 单精度浮点数

double(M,D) 8字节 双精度浮点数

decimal(M,D) M+2字节 定点数

注意:M值不含小数点所占的位数(包括小数部分, 但不包括小数点)

float与double和decimal的区别:

decimal类型是以字符串形式被存储起来的, 它的小数位是固定的, 适合财务运算;CPU不能直接运算, 影响运算效率

float与double类型数据会进行四舍五入;

float(7,2) double(7,2) decimal(7,2)

如果插入的浮点数宽度(不包括小数点)大于M值, 则插入失败(如:float(7,2)和decimal(7,2)列内插入.123)

如果插入的浮点数的小数位大于D值,则四舍五入取近似值(如:float(7,4)和decimal(7,4)列内插入99.00009, 近似结果是999.0001)

注意: 以上结果是在MySQL5.5.27版本的结果, 各版本测试的结果可能不一样;

通常float和double类型是类似PHP中float类型的”不精确小数”, 因此 float和double并不适合设定长度;

float和double两者设定的总长度, 其实是包括了小数点, 只是float精度更低, 能保留的有效数字只有6位;

decimal类型被称为”精确小数”—— 它能够精确表达一个小数的真实大小——它绕过了二进制表达小数的原理性缺陷! 那么它通常都应该明确指定长度!

而decimail却通常要求设定长度是更佳做法。如果decimal没有设定长度, 则默认小数位数为0。

小数型数据, 除了使用具体值进行表述还可以使用科学计数法进行表述

create table t_decimal(

d1 decimal(11,2)

)engine=myisam charset=utf8

insert into t_decimal values(1.23e3)

2、字符型

utf8编码下,一个汉字算三个字节, 一个数字或字母算一个字节。

其他编码下,一个汉字算两个字节, 一个数字或字母算一个字节;

mysql支持双引号和单引号 “abcde” ‘abcde’

mysql能识别转义字符”\”

varchar: 可变长度字符类型, 必须设长度, 最大65535个字符。但是:设定的长度只是最大可存储的值, 实际可以不存那么多。

char: 固定长度字符类型, 不设定长度就默认为1, 最大255个字符。实际存储的长度如果不够, 则会自动补”空格”填满设定的长度。

char(M) 255个字符 固定长度 用于性别、密码 访问速度快

varchar(M) 65535个字符 可变长度 用于用户名、文章标题 占有容量小

char(M): M代表字符长度, M理论值为255

varchar(M):M代表字符长度, M理论值为65535, 但是其与字符集有关。但是在不同的编码格式下, 其存储的最大字符以及占用的字节长度也是不同的!

LATIN1:一个字符占用1个字节长度

GBK: 一个汉字占用2个字节长度

UTF8: 一个汉字占用3个字节长度

占用的字节

char(4) varchar(4) M

” 4 ” 1个字节

‘ab’ 4 ‘ab’ 3个字节

‘abcd’ 4 ‘abcd’ 5个字节

‘abcdefg’ 4 ‘abcdefg’ 5个字节 MySQL5.5版本插入失败

‘ab ‘ 4 ‘ab ‘ 4个字节

‘高洛峰’ 6 ‘高洛峰’ 7个字节 GBK

‘爱新觉罗’ 8 ‘爱新觉罗’ 13个字节 UTF8

由此可知:M值不是限制字节数, 而是限制字符数;

varchar(M)类型当存储的字符小于255时, 其数据长度占用1个字节, 当存储的字符大于255时, 其数据长度占用2个字节。

varchar(M)类型所能保存的最大M字符长度

在gbk编码格式下, varchar类型最大只能存储32766个字符长度。

在utf8编码格式下, varchar类型最大只能存储21844个字符长度。

注意: char(M)类型的数据列里, 每个值都占用M个字符;

varchar字符型所占字节等于自身长度加1(M+1或2)

如果插入的字符串的长度超出了char(M)和varchar(M)字符型的M值, 则插入失败;

(ERROR 1406 (22001): Data too long for column ‘name’ at row 1)

如果插入的值小于M, MySQL就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉);

如果插入的值大于M, 则插入失败;

注意:varchar字符型后面必须加M值, 否则创建表失败; char字符型不设定长度就默认为1。

个人建议:

在实际项目开发中, 对于固定长度的字符, 建议使用char类型进行存储;

在实际项目开发中, 对于长度不固定且小于255个字符的情况, 建议采用varchar类型;

在实际项目开发中, 对于大于255个字符的情况, 通常采用text类型进行存储;

text 文本数据 (文章) 不区分大小写 65,535个字节

MEDIUMTEXT 16,777,215个字节

LONGTEXT 4,294,967,295个字节

blob 二进制数据 (相片) 区分大小写 65,535个字节

MEDIUMBLOB 16,777,215个字节

LONGBLOB 4,294,967,295个字节

ENUM 枚举(表示”多选一”选项的字符) 1或2字节

ENUM(“one”, “two”, “three”, “four”) — 65535, 一次只能有一个值

“one” 对应的下标为1, 从1开始计数;

“four” 对应的下标为4,

因此, 数据插入可以使用1~4分别代替, 在表单中value值可以用1-4代替

SET 集合(表示”多选多”选项的字符) 1, 2, 3, 4, 8字节

SET(“one”, “two”, “three”, “four”) — 64, 一次可以用多个集合中的值, 中间使用”,”分开

数据可以使用1~4分别代替, 在表单中value值可以用1-4代替, 但是下标不能代替多选, 只能代替单选;

注意:枚举和集合是字符串型, 建表时enum(1, 2, 3, 4)和set(1, 2, 3, 4) 是错误的写法;

插入的数据也要注意是字符串型, 除非是下标对应的选项

以文章的推荐与未推荐为例: isrecommend enum(“0”, “1”)

$isrecommend = isset($_GET[‘isrecommend’])?($_GET[‘isrecommend’]):””;

if($isrecommend){

$isrecommend = “0”; //注意枚举是字符串型数据

}else{

$isrecommend = “1”; //注意枚举是字符串型数据

}

$sql = “update blog_article set isrecommend = ‘$isrecommend’ where artid = ‘$artid'”;

注意:变量isrecommend是字符串型, 必须要加引号,

解释:如果插入整型1,SQL执行语句没有错误; 因为1代表下标, 选中”0″选项

如果插入整型0,SQL执行语句出现错误;因为enum枚举的数据必须是字符串

3、日期型

DATE YYYY-MM-DD ‘1000-01-01’到’9999-12-31’

TIME HH:MM:SS ‘-838:59:59’到’838:59:59’

DATETIME YYYY-MM-DD HH:MM:SS ‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’

TIMESTAMP YYYYMMDDHHMMSS ‘1970-01-01 00:00:00’到’2038-01-19 03:14:07’

时间戳, 就是表示”当前时刻”, 用于INSERT或UPDATE操作时自动获得当前时间(也就是无需给数据)

注意不是UNIX时间戳

YEAR YYYY ‘1901到2155’

创建表时最好不要使用这些中(上面)的时间格式(PHP中时间戳 1970-1-1 0:0:0)是一整数

用整数(int)保存时间 time(); 方便运算

datetime类型与timestamp类型区别

两者的存储范围不同:

datetime(‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’) timestamp(‘1970-01-01 00:00:00’到’2038-01-19 03:14:07’)

默认值不同:

datetime默认值为NULL timestamp默认值为服务器当前时间

time存储值问题

time类型除了可以存储当前时间还可以存储过去或未来的某个时间

其值的范围是:’-838:59:59’到’838:59:59′

year类型数据长度问题

year(2)位的年也是被允许的, 但是表示的范围70-69 表示:1970-2069范围

系统自动对分隔符进行修改, 自动添加前导0

如对 DATETIME 2016/05/10 9:22:03 -> 2016-05-10 09:22:03

YEAR 16 -> 2016

4 NULL 值

NULL和任何值都不能比较

NULL只能用IS NULL或者IS NOT NULL来判断, 不能用=或者!=来判断

下列语句不返回任何行, 因为对任何表达式, expr = NULL是假的

SELECT * FROM my_table WHERE phone = NULL;

要想寻找NULL值, 你必须使用IS NULL

SELECT * FROM my_table WHERE phone IS NULL;

SELECT * FROM my_table WHERE phone = “”;

归纳:

float(M,D) double(M,D) decimal(M,D) char(M) varchar(M)

如果插入的值超过M值

MySQL5.1版本 小数型取近似值, 字符串进行截取

MySQL5.5版本 插入失败

MySQL5.1低版本会自动则对值进行裁剪以使其适合。如果被裁掉的字符不是空格, 则会产生一条警告,但数据被裁剪后,插入成功;

mysql> create table tb_user(

-> id int,

-> name varchar(5)

-> )engine=myisam;

Query OK, 0 rows affected (0.14 sec)

mysql> insert into tb_user values(null,’namamma’)

Query OK, 1 row affected, 1 warning (0.00 sec))

在varchar(M)类型的数据列里, 每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为M+1字节)。

select any_value(name), group_id from game group by group_id

MySQL 数据值和列类型

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/174815.html

(0)
上一篇 2025-03-29 10:00
下一篇 2025-03-29 10:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信