1. 程式人生 > 實用技巧 >Stream(二)—數值流與物件流的轉化及其方法使用

Stream(二)—數值流與物件流的轉化及其方法使用

資料型別

  • 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)`