mysql> create table tt1(num tinyint );Query OK, 0 rows affected ( 0.02 sec)mysql> insert into tt1 values ( 1 );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt1 values ( 128 ); -- 越界插入,报错ERROR 1264 ( 22003 ): Out of range value for column 'num' at row 1mysql> select * from tt1;+------+| num |+------+| 1 ????? |+------+1 row in set ( 0.00 sec)
mysql> create table tt2(num tinyint unsigned );mysql> insert into tt2 values (- 1 ); -- 无符号,范围是: 0 - 255ERROR 1264 ( 22003 ): Out of range value for column 'num' at row 1mysql> insert into tt2 values ( 255 );Query OK, 1 row affected ( 0.02 sec)mysql> select * from tt2;+------+| num |+------+| 255?? |+------+1 row in set ( 0.00 sec)
bit [(M)] : 位字段类型。 M 表示每个值的位数,范围从 1 到 64 。如果 M 被忽略,默认为 1 。
举例: ?
mysql> create table tt4 ( id int , a bit ( 8 ));Query OK, 0 rows affected ( 0.01 sec)mysql> insert into tt4 values ( 10 , 10 );Query OK, 1 row affected ( 0.01 sec)mysql> select * from tt4; # 发现很怪异的现象, a 的数据 10 没有出现+------+------+| id? ? ?| a? ? ? |+------+------+| 10? ?? |???????? |+------+------+1 row in set ( 0.00 sec)?
bit使用的注意事项:
bit字段在显示时,是按照ASCII码对应的值显示。
mysql> insert into tt4 values ( 65 , 65 );mysql> select * from tt4;+------+------+| id? ? ?| a? ? ?|+------+------+| 10? ?? |????????|| 65? ?? | A? ? ?|+------+------+?
如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
mysql> create table tt5(gender bit ( 1 ));mysql> insert into tt5 values ( 0 );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt5 values ( 1 );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt5 values ( 2 ); -- 当插入 2 时,已经越界了ERROR 1406 ( 22001 ): Data too long for column 'gender' at row 1?
float [(m, d)] [ unsigned ] : M 指定显示长度, d 指定小数位数,占用空间 4 个字节
mysql> create table tt6(id int , salary float ( 4 , 2 ));Query OK, 0 rows affected ( 0.01 sec)mysql> insert into tt6 values ( 100 , - 99.99 );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt6 values ( 101 , - 99.991 ); # 多的这一点被拿掉了Query OK, 1 row affected ( 0.00 sec)mysql> select * from tt6;+------+--------+| id? ? ?| salary |+------+--------+| 100?? | - 99.99 || 101?? | - 99.99 |+------+--------+2 rows in set ( 0.00 sec)
mysql> create table tt7(id int , salary float ( 4 , 2 ) unsigned );Query OK, 0 rows affected ( 0.01 sec)mysql> insert into tt7 values ( 100 , - 0.1 );Query OK, 1 row affected, 1 warning ( 0.00 sec)mysql> show warnings;+---------+------+-------------------------------------------------+| Level? ?|Code| Message ???????????????????????????????????????????|+---------+------+-------------------------------------------------+|Warning| 264 | Out of range value for column 'salary' at row 1 |+---------+------+-------------------------------------------------+1 row in set ( 0.00 sec)mysql> insert into tt7 values ( 100 , - 0 );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt7 values ( 100 , 99.99 );Query OK, 1 row affected ( 0.00 sec)
语法:
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
mysql> create table tt8 ( id int , salary float ( 10 , 8 ), salary2decimal ( 10 , 8 ));mysql> insert into tt8 values ( 100 , 23.12345612 , 23.12345612 );Query OK, 1 row affected ( 0.00 sec)mysql> select * from tt8;+------+-------------+-------------+| id? ? ?| salary? ? ? | salary2 |+------+-------------+-------------+| 100 | 23.12345695 | 23.12345612 | # 发现 decimal 的精度更准确,因此如果我们希望某个数据表示高精度,选择 decimal+------+-------------+-------------+
?
建议:如果希望小数的精度高,推荐使用 decimal 。
char (L): 固定长度字符串, L 是可以存储的长度,单位为字符,最大长度值可以为 255
案例(char):
mysql> create table tt9(id int , name char ( 2 ));Query OK, 0 rows affected ( 0.00 sec)mysql> insert into tt9 values ( 100 , 'ab' );Query OK, 1 row affected ( 0.00 sec)mysql> insert into tt9 values ( 101 , ' 中国 ' );Query OK, 1 row affected ( 0.00 sec)mysql> select * from tt9;+------+--------+| id? ? ?| name |+------+--------+| 100 | ab? ? ? ?|| 101 | 中国? ?? |+------+--------+?
mysql> create table tt10(id int ,name char ( 256 ));ERROR 1074 ( 42000 ): Column length too big for column 'name' (max = 255 ); useBLOB or TEXT instead
语法:?
varchar (L): 可变长度字符串, L 表示字符长度,最大长度 65535 个字节
案例:
mysql> create table tt10(id int ,name varchar ( 6 )); -- 表示这里可以存放 6 个字符mysql> insert into tt10 values ( 100 , 'hello' );mysql> insert into tt10 values ( 100 , ' 我爱你,中国 ' );mysql> select * from tt10;+------+--------------------+| id? ? | name? ? ? ? ? ? ? ??|+------+--------------------+| 100 | hello???????????????? || 100 | 我爱你,中国? ? |+------+--------------------+?
mysql> create table tt11(name varchar ( 21845 ))charset=utf8; -- 验证了 utf8 确实是不能超过 21844ERROR 1118 ( 42000 ): Row size too large. The maximum row size for the usedtable type, not counting BLOBs, is 65535 . You have to change some columns toTEXT or BLOBsmysql> create table tt11(name varchar ( 21844 )) charset=utf8;Query OK, 0 rows affected ( 0.01 sec)
?
// 创建表mysql> create table birthday (t1 date , t2 datetime , t3 timestamp );Query OK, 0 rows affected ( 0.01 sec)// 插入数据:mysql> insert into birthday(t1,t2) values ( '1997-7-1' , '2008-8-8 12:1:1' ); -- 插入两种时间Query OK, 1 row affected ( 0.00 sec)mysql> select * from birthday;+------------+---------------------+---------------------+| t1? ? ? ? ? ? | t2??????????????????????| t3? ? ? ? ? ? ? ? ? ? ? ?|+------------+---------------------+---------------------+| 1997 - 07 - 01 | 2008 - 08 - 08 12 :01:01 | 2017 - 11 - 12 18 :28:55 | -- 添加数据时,时间戳自动补上当前时间+------------+---------------------+---------------------+// 更新数据:mysql> update birthday set t1= '2000-1-1' ;Query OK, 1 row affected ( 0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from birthday;+------------+---------------------+---------------------+| t1? ? ? ? ? ? | t2???????????????????????| t3? ????????????????????|+------------+---------------------+---------------------+| 2000 - 01 - 01 | 2008 - 08 - 08 12 :01:01 | 2017 - 11 - 12 18 :32:09 | -- 更新数据,时间戳会更新成当前时间+------------+---------------------+---------------------+
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
mysql> create table votes(-> username varchar ( 30 ),-> hobby set ( ' 登山 ' , ' 游泳 ' , ' 篮球 ' , ' 武术 ' ), -- 注意:使用数字标识每个爱好的时候,想想Linux 权限,采用比特位位置来个 set 中的爱好对应起来-> gender enum ( ' 男 ' , ' 女 ' )); -- 注意:使用数字标识的时候,就是正常的数组下标Query OK, 0 rows affected ( 0.02 sec)
插入数据:
insert into votes values ( ' 雷锋 ' , ' 登山 , 武术 ' , ' 男 ' );insert into votes values ( 'Juse' , ' 登山 , 武术 ' , 2 );select * from votes where gender= 2 ;+----------+---------------+--------+| username | hobby | gender |+----------+---------------+--------+| Juse? ? ?| 登山 , 武术?? |女 ???????|+----------+---------------+--------+?
有如下数据,想查找所有喜欢登山的人:
+-----------+---------------+--------+| username | hobby | gender |+-----------+---------------+--------+| 雷锋? ? ?? | 登山 , 武术 | 男 || Juse? ???| 登山 , 武术 | 女 || LiLei ? ??| 登山? ? ? ? ?| 男 || LiLei? ?? | 篮球? ??? ??| 男 || HanMeiMei | 游泳 | 女 |+-----------+---------------+--------+?
使用如下查询语句:
mysql> select * from votes where hobby= ' 登山 ' ;+----------+--------+--------+| username | hobby | gender |+----------+--------+--------+| LiLei? ? ?| 登山? ? | 男? ? ?? |+----------+--------+--------+?
mysql> select find_in_set( 'a' , 'a,b,c' );+---------------------------+| find_in_set( 'a' , 'a,b,c' ) |+---------------------------+| ?????????????????????????????? 1 |+---------------------------+mysql> select find_in_set( 'd' , 'a,b,c' );+---------------------------+| find_in_set( 'd' , 'a,b,c' ) |+---------------------------+| ?????????????????????????????? 0 |+---------------------------+
查询爱好登山的人:
mysql> select * from votes where find_in_set( ' 登山 ' , hobby);+----------+---------------+--------+| username | hobby | gender |+----------+---------------+--------+| 雷锋? ? ? | 登山 , 武术 | 男 || Juse? ? | 登山 , 武术 | 女 || LiLei? ? | 登山? ???????| 男 |+----------+---------------+--------+?
?
?
?
?
?
?
?
?
?
?