MySQL 字串类型资料之基本操作

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"。

https://ithelp.ithome.com.tw/upload/images/20210104/201261820WKuwkRKdH.png

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: 0

mysql> 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    |       |
+----------+-------------+------+-----+---------+-------+

<<:  安全意识,培训和教育(security awareness, training and education)

>>:  iOS APP 开发 OC 第十一天,block 简写

DAY 19:Prototype Pattern,创建物件不再从头开始浪费时间

什麽是 Prototype Pattern? 将物件以拷贝的方式建立 如果某类物件在初始化时,会消耗...

练习实作的轮回

这次我就沿用上篇的程序码接续练习转xlsx档。恩~所以这篇应该会满短的,主要是看我学习成果。XD 首...

Day 6 : 案例分享(2.2) B2B 网页下单+後台月结+前台付款

案例说明及适用场景 也算是买卖业,但对象不是一般客户,而是厂商 面对厂商,一般来说都会有寄仓、月结收...

[Day22] Emmet 学习笔记 - CSS篇

CSS的简写通常很直觉,会取每个音节的第一个字母来用,但有些似乎是有重叠的关系,就会不太一样,需要特...

Day 22 - Formatter 与 Linter - 提升程序品质工具

前言 昨天讲完 Code Review,团队一致的写 code 风格,可以大幅提升 review 的...