1. 程式人生 > >MySql表類型

MySql表類型

全部 取出 編碼 eight asd 屬性 簡單 開發 rdquo

創建table表

別人給我們建好了表,我們可以增刪改查數據,特別是查詢,變化非常大。
如果別人沒有把表給我們,我們連上數據庫,要自己建一張表,根據項目的要求,做一個博客,一
個商城,具體分析這個商城項目應該如何建表。
如何建一張表?

技術分享圖片

我們把表頭聲明完之後,表就已經聲明好了;
所謂建表的過程 ---> 就是聲明表頭的過程;
表頭的第一行 ---> 我們叫做列,裏面起的名字,我們叫 列名
拿到數據中來說: 我們建表的過程 => 就是 聲明列 的過程;

建立以個簡單的表:

1 CREATE TABLE t1(
2 sn INT,
3 name VARCHAR(10)
4 );

我們用word建表,每個列是都不是等寬分布的,同樣在數據庫中,表中的列並不是等寬的
像: 學號 姓名 家庭地址 性別

我們要根據這個字段有可能要存儲的最大的長度,來給列分布一個最合理的寬度。
如果分配的太寬了,A4紙就浪費了,如果分配的太窄了,有可能內容就放不下了。

數據庫將我們的內容放在磁盤上,我們的內存也是有限的,所以我們在建表的時候需要考慮列的屬
性。
我們要分析,就是這個列,最大能存多少,然後我們選取一個合理的列類型,合理的列寬度;
使之既能放下內容,不浪費磁盤空間,還要查詢速度快。

列的屬性聲明規則:

CREATE TABLE 表名 (
列1 列類型 [列屬性 默認值],
列2 列類型 
[列屬性 默認值], ..... 列n 列類型 [ 列屬性 默認值] );

最後還需要聲明引擎和字符集

1 CREATE TABLE 表名 (
2 列1 列類型 [列屬性 默認值],
3 列2 列類型 [列屬性 默認值],
4 .....
5 列n 列類型 [ 列屬性 默認值]
6 )ENGINE=MyISAM DEFAULT CAHRSET=utf8;

HTML之前的設置為UTF-8
MySQL設置為utf8,沒有杠。

列的三大分類

列類型大致分為3類:
1.數值型
整型,浮點型,定點型
2.字符串
char,varchar,text
3.日期時間類型 2012-12-13 14:26:23(略。。。。。

一般存儲註冊時間,商品發布時間等,並不是用datetime存儲,是用時間戳,且用的還是PHP的
時間戳,而不是MYSQL的。

整型

技術分享圖片

mysql 利用的是字節來表示範圍和寬度的。
之前創建過一個表,是int類型的,占4個字節。
1個字節有8個位,每一個位上都有0、1兩種可能。
0000 0000

那4個字節int類型在磁盤中比如說存放1這個數字,存法如下:
00000000 00000000 00000000 00000001

int類型存儲的範圍是多少能不能算出來?
11111111 11111111 11111111 11111111
2的32次方-1大概是42億

說明:
一個列,占的字節越多,存儲的範圍越?。
沒必要死記,記住大致範圍即可。
什麽時候用無符號的?
比如:人的年齡,tinyint 類型無符號

整型列的可選參數

理解並能應用 UNSIGNED,ZEROFILL 及 M 屬性
以tinyint為例
有符號:-128 ~ 127
無符號:0 ~ 255

1) UNSIGNED 表示無符號,列的值從0開始,不能為負數
新建一個表t2:

-- 如果只聲明TINYINT類型不給任何參數,表示有符號的,可以寫負數
CREATE TABLE t2(
num TINYINT
);
CREATE TABLE t2(
num TINYINT UNSIGNED
);
-- 這個沒問題
INSERT INTO t2 VALUES(240);
-- 這個就會報錯
INSERT INTO t2 VALUES(-120);

2)zerofill 適合用於 學號,編碼等,固定寬度的數字,可以用 0 填充至固定寬度

1 -- 改變表t2添加sn列,屬性是tinyint(5)位,不足5位用0填充到5位
2 ALTER TABLE t2 ADD sn TINYINT(5) ZEROFILL;

註意:填寫了ZEROFILL屬性後不用使用UNSIGNED進行無符號聲明,因為碰到需要填充0的數字,生
活中根本沒有負數的。

查看表結構使用DESC

1 DESC t;

我們可以看出,插入的sn列,已經為UNSIGNED類型

3)關於TINYINT類型的後?括號中的5(M)
因為INTYINT類型本身就是有範圍的,所以這個括號以後的值,如果沒有ZEROFILL聲明填充,這個值
根本沒有作用,這個值就是為了跟ZEROFILL做配合使用的。

1 -- 規定好所謂的TINYINT(1)位
2 Alter table t2 ADD m TINYINT(1) UNSIGNED;
3 -- 填寫一個三位的100,還是可以添加成功
4 INSERT INTO t2(m) values(100);

浮點列與定點列

FLOAT:浮點型,單精度浮點型
DOUBLE:範圍更大的浮點型,雙精度浮點數
DECIMAL:定點型,無精度損失

範圍:
float -3.402823466E+38 到-1.175494351E-38、 0 和 1.175494351E-38 到 3.402823466E+38。 這
些是理論限制, 基於 IEEE 標準。 實際的範圍根據硬件或操作系統的不同可能稍微小些。 double 更
大,沒必要去記憶他們的範圍,除非搞天文 。

FLOAT(M,D) DOUBLE(M,D)
整型的M遇到ZEROFILL才會起作用。
FLOAT的M和D只要設置了,立馬就起作用。
M 是精度,總位數。
D 標度, 小數點後面的位數 。
測試:FLOAT(5,2)

create table t4(
money float(5,2)
);


-- 報錯
insert into t4 values (9999);
-- 正常
insert into t4 values (999.99);
-- 報錯
insert into t4 values (1000);
-- 正常
insert into t4 values (-999.99);
-- 報錯
insert into t4 values (-1000);

DECIMAL(M,D) 定點型
更加精準,無精度損失
測試:

CREATE TABLE t5(
f FLOAT(9,2),
d DECIMAL(9,2)
);
-- 仔細觀察插入的同樣的數據,查詢出來的結果
INSERT INTO t5 VALUES (1234567.23,1234567.23);
-- 一個小數點是25 另一個是23

我們可以清晰的看到,f列,我們插入的數據跟顯示的數據是不同的。
float/double , 有精度損失。
decimal 定點型,更精確。
定點型,是將整數部分和小數部分分別用數字來存儲的,所以定點型更精確 。

字符型列

字符型:
CHAR VARCHAR TEXT/BLOB ENUM
CHAR 定長存儲內容
VARCHAR 變長存儲內容

1. CHAR和VARCHAR有什麽區別呢?
CHAR(M),VARCHAR(M)都設置10個字符的寬度
1)定長的CHAR(10),是固定的長度
給定列10個字符的寬度,最多能存10個字符
哪怕你就是寫一個字符,它也站10個字符,就好比你去吃自助餐,給了100塊錢,吃多吃少都得花
100。

2)變?的VARCHAR(10),是可變長度
給定列10個字符的寬度,最多也能存10個字符,多了也存不了
比如說給1個字符的寬度,用多少占多少,利用率是否是100%?當然不是,那就沒有CHAR類型的必
要了。
它會在每一個10個長度的前面添加1-3個字符作為提示信息,用於提示後面還有多少個長度,需要占
空間的

2. 那到底是選擇CHAR還是VARCHAR呢?
現在磁盤容量都非常的大,如果存儲的字符不是很多,比如20個字符以內,其實都用CHAR,速度會更快,
像微博那樣的,用的就是VARCHAR,因為它被限定在140個字符,而且還是可變的140。

3. char沒有存夠指定的長度,也能占據指定的長度,是如何做到的呢?
char 不夠指定長度時用”\0”(空格)來填充,取出時,會把右側的空格全部抹掉。
註: 這意味著,如果右側有本身有空格,將會丟失。
實驗測:

CREATE TABLE t6(
n1 CHAR(10),
n2 VARCHAR(10)
);
INSERT INTO t6 VALUES ( hello , hello );
SELECT * FROM t6;
-- CONCAT()函數,內容拼接函數,可以自由往字段中添加值
SELECT CONCAT(!,n1,!),CONCAT(!,n2,!) from t6; -- 會發現CHAR類型後面的空格消失了。

所有的空格都一樣,mysql無法區分這是你本身的空格,所以char在取出時,將右側的空格給刪除掉
了。
而varchar型則不會刪除後面本身的空格,因為在它的開始處有1-3個字節已經說明了這個列占幾個字
符。

註意: char(M),varchar(M),限制的是字符,不是字節
即 char(2) charset utf8,能存2個utf8字符,比如‘中國‘
4. char/varchar 最大可存多少個字符:
CHAR列的長度固定為創建表時聲明的長度。
長度可以為從0到255的任何值。

VARCHAR列中的值為可變長字符串。長度也可以隨便寫,但不能超過手冊規定的字節數
也就是說,雖然手冊中寫的是0到65535個字節,但規定的是範圍是字節數,而參數裏寫的是字符數。
比如:VARCHAR(100) ---> 就表示可以寫100個漢字,但實際的最大支持肯定到不了65535,因為漢字
utf8編碼一個漢字占3個字節,最大長度也就是21845,而GBK一個漢字占2個字節,最大到32766。

文本類型

TEXT(M)
可以存比較大的文本段,搜索速度稍慢。
因此,如果不是特別大的內容,建議用char,varchar來代替。
最大長度為65,535(2^16–1)字符的TEXT列。

1 CREATE TABLE t8 (
2 te TEXT
3 );
4 -- 添加字符串到t8中,最大長度65535個字符,比VARCHAR大,但速度慢
5 INSERT INTO t8 values (asdf asd fsdwerdsf );
6 SELECT * FROM t8;

BLOB(M)
?進制類型
其實,如果不是存圖像,blob基本用不上
blob是用來存儲圖像,音頻等二進制信息
但實際開發我們會選擇本地存儲圖像音頻等,而不是在數據庫存儲,數據庫只存一個路徑。

ENUM(‘v1‘,‘v2‘,....)
枚舉類型
是定義好,值,就在某一個枚舉範圍內,它是個單選值。
比如說定義兩個值 (‘boy’,’girl’) ,INSERT 時,只能選”boy”,”girl”

1 CREATE TABLE t10 (
2 gender ENUM (boy,girl)
3 );
4 INSERT INTO t10 VALUES (girl);
5 INSERT INTO t10 VALUES (xxx);
6 INSERT INTO t10 VALUES (boy);

SET 集合類型
它是一個設置, 字符串對象可以有零個或多個值, 每個值必須來自列值‘value1‘, ‘value2‘, ...SET列
最多可以有64個成員,它是多選值。
限制太多,一般很少用。
SET內的數據順序是由列表順序決定的
不可以插入非SET中定義好的值
不可以修改已經使用過的值
不可以使用重復值

文章轉載至:https://www.cnblogs.com/zhony/p/10210793.html

MySql表類型