iT邦幫忙

0

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

尚未有邦友留言

立即登入留言