Stream(二)—數值流與物件流的轉化及其方法使用
阿新 • • 發佈:2020-11-27
資料型別
- MySQL中的資料型別是強型別
數值型
整型
- 整型
- 範圍要儘可能小,範圍越小,佔用空間越少
- 無符號整數是整數的兩倍
- 整形支援顯示寬度,顯示寬頻是最小的顯示位數,必須結合zerofill才起作用
整型 | 佔用位元組數 | 範圍 |
---|---|---|
tinyint | 1 | -128~127 |
smallint | 2 | -32768~32767 |
mediumint | 3 | -8388608~8388607 |
int | 4 | -2147483648~2147483647 |
bigint | 8 | -9223372036854775808~9223372036854775807 |
-- 範圍要儘可能小,範圍越小,佔用空間越少 mysql> create table stu1( -> id tinyint, -> name varchar(20) -> ); # `Query OK, 0 rows affected (0.02 sec)` -- 超出範圍會報錯 mysql> insert into stu1 values (128,'tom'); # `ERROR 1264 (22003): Out of range value for column 'id' at row 1`
-- 無符號整形就是沒有負數,無符號整數是整數的兩倍
mysql> create table stu2(
-> id tinyint unsigned
-> );
# `Query OK, 0 rows affected (0.02 sec)`
mysql> insert into stu2 values (128);
# `Query OK, 1 row affected (0.00 sec)`
-- 新增前導0,int(5)顯示寬頻是5 mysql> create table stu4( -> id int(5), -> num int(5) zerofill # 新增前導0,int(5)顯示寬頻是5 -> ); # `Query OK, 0 rows affected (0.05 sec)` mysql> insert into stu4 values (12,12); # `Query OK, 1 row affected (0.00 sec)` mysql> select * from stu4; +------+-------+ | id | num | +------+-------+ | 12 | 00012 | +------+-------+ # `1 row in set (0.00 sec)`
浮點型
- 浮點型
- 浮點數有單精度和雙精度
- 浮點數支援科學計數法
- 浮點數精度會丟失
浮點型 | 佔用位元組數 | 範圍 |
---|---|---|
float(單精度型) | 4 | -3.4E+38~3.4E+38 |
double(雙精度型) | 8 | -1.8E+308~1.8E+308 |
- 浮點數的宣告
float(M, D)
M:總位數 D:小數位數double(M,D)
M:總位數 D:小數位數- 不指定位數,預設是小數點後面6位 double預設是17位
-- 浮點數有單精度和雙精度 mysql> create table stu5( -> num1 float(5,2), -- 浮點數 -> num2 double(6,1) -- 雙精度數 -> ); # `Query OK, 0 rows affected (0.05 sec)` mysql> insert into stu5 values (3.1415,12.96); # `Query OK, 1 row affected (0.00 sec)` mysql> select * from stu5; +------+------+ | num1 | num2 | +------+------+ | 3.14 | 13.0 | +------+------+ # `1 row in set (0.00 sec)`
-- MySQL浮點數支援科學計數法
mysql> create table stu6(
-> num float
-> );
# `Query OK, 0 rows affected (0.03 sec)`
mysql> insert into stu6 values (5E2),(6E-2);
# `Query OK, 2 rows affected (0.00 sec)`
# `Records: 2 Duplicates: 0 Warnings: 0`
mysql> select * from stu6;
+------+
| num |
+------+
| 500 |
| 0.06 |
+------+
# `2 rows in set (0.00 sec)`
-- 浮點數精度會丟失
mysql> insert into stu6 values(99.999999999);
# `Query OK, 1 row affected (0.00 sec)`
mysql> select * from stu6;
+------+
| num |
+------+
| 100 |
+------+
定點數
-
定點數(小數)
- 將整數部分和小數部分分開儲存
- decimal是變長的,大致是每9個數字用4個位元組儲存,整數和小數分開計算
- M最大是65, D最大是30, 預設是(10,2)
- 定點和浮點都支援無符號、顯示寬度0填充
-
定點數宣告
decimal(M,D)
M:總位數 D:小數位數
-- 存放定點數
mysql> create table stu8(
-> num decimal(20,9)
-> );
# `Query OK, 0 rows affected (0.00 sec)`
mysql> insert into stu8 values(12.999999999);
# `Query OK, 1 row affected (0.00 sec)`
mysql> select * from stu8;
+--------------+
| num |
+--------------+
| 12.999999999 |
+--------------+
# `1 row in set (0.00 sec)`
字元型
- 字元型
- 在資料庫中沒有字串概念, 只有字元, 所以資料庫中只能用單引號
- 一條記錄的總長度不能超過65535
- text系列在表中儲存的是地址
- char是定長,char最大值是255
- var是變長,varchar最大值是65535,具體要看字元編碼
資料型別 | 描述 |
---|---|
char | 定長字元,最大可以到255 |
varchar | 可變長度字元,最大可以到65535 |
tinytext | 28–1 =255 |
text | 216–1 =65535 |
mediumtext | 224–1 |
longtext | 232–1 |
- 不同編碼下的儲存說明
char(4)
存放4個字元,中英文一樣varchar(L)
實現變長機制,需要額外的空間來記錄資料真實的長度- L的理論長度是65535,但事實上達不到,因為有的字元是多位元組字元,所以L達不到65535
-- 在utf8編碼下,一個字元佔用3個位元組,max=21845
MariaDB [stu]> create table stu1(
-> name varchar(65535)
-> )charset=utf8;
# `Query OK, 0 rows affected, 1 warning (0.036 sec)`
-- 在gbk下一個字元佔用2個位元組,max=32767
MariaDB [stu]> create table stu2(
-> name varchar(65535)
-> )charset=gbk;
# `Query OK, 0 rows affected, 1 warning (0.023 sec)`
-- text系列的型別在表中儲存的是地址,佔用大小大約10個位元組
MariaDB [stu]> create table stu3(
-> id int,
-> name longtext
-> );
# `Query OK, 0 rows affected (0.029 sec)`
-- 一個記錄的所有欄位的總長度也不能超過65535個位元組
MariaDB [stu]> create table stu4(
-> name varchar(65536),
-> id int
-> );
# `Query OK, 0 rows affected, 1 warning (0.021 sec)`
列舉
-
列舉(enum)
- 列舉是從集合中單選一個值作為資料
- 列舉值是通過整形數字來管理的,第一個值是1,第二個值是2,以此類推
- 列舉值在資料庫儲存的是整型數字
-
列舉的優點
- 限制值
- 節省空間
- 執行速度快(整型比字元型執行速度快)
-
思考:已知列舉佔用兩個位元組,所以最多可以有多少個列舉值?
- 2位元組=16位,2^16=65536,範圍是(0-65535)
- 由於列舉從1開始,所以列舉值最多有65535個
mysql> create table stu12(
-> name varchar(20),
-> sex enum('男','女','保密')
-> );
# `Query OK, 0 rows affected (0.06 sec)`
-- 插入的列舉值只能是列舉中提供的選項
mysql> insert into stu12 values ('tom','男');
# `Query OK, 1 row affected (0.00 sec)`
-- 報錯,只能插入男、女、保密
mysql> insert into stu12 values ('tom','不告訴你');
# `ERROR 1265 (01000): Data truncated for column 'sex' at row 1`
mysql> insert into stu12 values ('berry',2);
# `Query OK, 1 row affected (0.00 sec)`
mysql> select * from stu12;
+-------+------+
| name | sex |
+-------+------+
| tom | 男 |
| berry | 女 |
+-------+------+
mysql> select * from stu12 where sex=2;
+-------+------+
| name | sex |
+-------+------+
| berry | 女 |
+-------+------+
# `1 row in set (0.00 sec)`
集合
-
集合(set)
- 從集合中選擇一些值作為資料(多選)
- 集合和列舉一樣,也為每個集合元素分配一個固定值
- 分配方式是從前往後按2的0、1、2、…次方
- 轉換成二進位制後只有一位是1,其他都是0
-
已知集合型別佔8個位元組,那麼集合中最多有多少選項
- 有64個選項
-- 插入的順序不一樣,但顯示的順序一樣
mysql> create table stu13(
-> name varchar(20),
-> hobby set('爬山','讀書','游泳','燙頭') -- 集合
-> );
# `Query OK, 0 rows affected (0.00 sec)`
mysql> insert into stu13 values ('tom','爬山');
mysql> insert into stu13 values ('Berry','爬山,游泳');
# `Query OK, 1 row affected (0.00 sec)`
mysql> insert into stu13 values ('Berry','游泳,爬山');
# `Query OK, 1 row affected (0.00 sec)`
mysql> select * from stu13;
+-------+-----------+
| name | hobby |
+-------+-----------+
| tom | 爬山 |
| Berry | 爬山,游泳 |
| Berry | 爬山,游泳 |
+-------+-----------+
# `3 rows in set (0.00 sec)`
MariaDB [stu]> insert into stu5 values('marry','攝影,讀書');
# `Query OK, 1 row affected (0.014 sec)`
MariaDB [stu]> insert into stu5 values('tomy',8);
# `Query OK, 1 row affected (0.009 sec)`
MariaDB [stu]> insert into stu5 values('marry',16);
# `Query OK, 1 row affected, 1 warning (0.003 sec)`