VARCHAR & CHAR
VARCHAR(0-65535)/CHAR(0-255)差别于可储存长度差别之外。
VARCHAR的长度是不固定
的 EX:密码,CHAR的长度是固定
的EX:电话。
当我们设置CHAR(4),代表储存佔有空间为4BYTES,VARCHAR(4)储存佔有空间为实际我们传入值之长度
。
mysql> CREATE TABLE test1(a CHAR(4),b VARCHAR(4));mysql> DESC test1;+-------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| a | char(4) | YES | | NULL | || b | varchar(4) | YES | | NULL | |+-------+------------+------+-----+---------+-------+2 rows in set (0.01 sec)
CHAR_LENGTH(a) 可获取其字串之长度。
LENGTH(a) 可获取其字串佔有之BYTE。
mysql> SELECT CHAR_LENGTH(a) , CHAR_LENGTH(b) FROM test1;+----------------+----------------+| CHAR_LENGTH(a) | CHAR_LENGTH(b) |+----------------+----------------+| 3 | 3 |+----------------+----------------+1 row in set (0.01 sec)mysql> SELECT LENGTH(a) ,LENGTH(b) FROM test1;+-----------+-----------+| LENGTH(a) | LENGTH(b) |+-----------+-----------+| 3 | 3 |+-----------+-----------+1 row in set (0.00 sec)
BINARY & VARBINARY
BINARY(4),d VARBINARY(4)对应CHAR及VARCHAR,但较少用到。
差别在于BINARY在未满设置的储存空间会以\0补齐
,也就是0x00。
mysql> CREATE TABLE test2(c BINARY(4),d VARBINARY(4));mysql> INSERT INTO test2 values("a ","a ");mysql> DESC test2;+-------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| c | binary(4) | YES | | NULL | || d | varbinary(4) | YES | | NULL | |+-------+--------------+------+-----+---------+-------+mysql> SELECT LENGTH(c) FROM test2;可发现BINARY储存空间已被补齐。+-----------+| LENGTH(c) |+-----------+| 4 |+-----------+mysql> SELECT LENGTH(d) FROM test2;+-----------+| LENGTH(d) |+-----------+| 2 |+-----------+
BLOB & TEXT
可以将BLOB视为储存更大的VARBINARY。同样,可以将TEXT视为储存更大的VARCHAR。
由于少见且不方便DEMO,故就简述带过。
ENUM
前面文章有介绍过,这边也不多赘述。
mysql> CREATE TABLE shirts ( -> name VARCHAR(40), -> size ENUM('x-small', 'small', 'medium', 'large', 'x-large') -> );
可以输入对应ENUM的下标
来节省时间。
INSERT INTO shirts values("polo2","1"); (取第一个ENUM所设置的值)
利用ENUM特性可以限制特定资料值,而不会出现ENUM所设置的资料範围之外的值。
mysql> INSERT INTO shirts values("polo2","big");ERROR 1265 (01000): Data truncated for column 'size' at row 1
SET
SET可以创建一个组合
,由我们所设置的值,来建立一个组合,并且以二进制为顺序
,依序对应不同组合,如 000(0) 对应 " " 空字串, 001(1) 对应 "one" ,111(7) 对应 "one,two,three"。
mysql> CREATE TABLE test3(a SET('one','two','three'));Query OK, 0 rows affected (0.04 sec)mysql> DESC test3;+-------+--------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+--------------------------+------+-----+---------+-------+| a | set('one','two','three') | YES | | NULL | |+-------+--------------------------+------+-----+---------+-------+mysql> INSERT INTO test3 values(0);mysql> INSERT INTO test3 values(1);mysql> INSERT INTO test3 values(7);mysql> SELECT * FROM test3;+---------------+| a |+---------------+| || one || one,two,three |+---------------+
SET值中设置N个值,即可获得2^N种组合。
ALTER TABLE table_name MODIFY column_name data_type
今天假设我们需要改变资料之类型,并确保资料内的值不改变,可使用ALTER这个语法。
创建一个TABLE,并且插入值后。
mysql> CREATE TABLE user( username varchar(10) , password varchar(20) );mysql> DESC user;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| username | varchar(10) | YES | | NULL | || password | varchar(20) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+2 rows in set (0.01 sec)mysql> INSERT INTO user(username , password) values ("jojo","12334455");mysql> SELECT * FROM user;+----------+----------+| username | password |+----------+----------+| jojo | 12334455 |+----------+----------+1 row in set (0.00 sec)
我们利用ALTER改变资料之类型(只能改变为与值相符的类型,比如此例无法将资料类型改为DATE、INTEGER...)。可发现值并无改变,且资料类型已经改变。
mysql> ALTER TABLE user MODIFY username CHAR(20);Query OK, 1 row affected (0.12 sec)Records: 1 Duplicates: 0 Warnings: 0mysql> SELECT * FROM user;+----------+----------+| username | password |+----------+----------+| jojo | 12334455 |+----------+----------+mysql> DESC user;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| username | char(20) | YES | | NULL | || password | varchar(20) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+