MySQL数据类型和运算符
mysql支持多種數據類型,主要有下面三種:
- 數值數據類型
- 日期/時間類型
- 字符串類型
整數類型
不同數據類型有不同的取值范圍,可存儲的值的范圍越大,則所需的存儲空間也越大。
整數類型主要有:
tinyint,smallint,mediumint,int(integer),bigint
整數類型的屬性可以添加auto_increment自增約束條件。
| 類型名稱 | 說明 | 存儲需求 | 有符號數 | 無符號數 |
| tinyint | 很小的整數 | 1個字節 | -129~127 | 0~255 |
| smallint | 小的整數 | 2個字節 | -32768~32767 | 0~65535 |
| mediumint | 中等大小的整數 | 3個字節 | -8388608~8388607 | 0~16777215 |
| int(integer) | 普通大小的整數 | 4個字節 | -2147483648~2147483647 | 0~4294967295 |
| bigint | 大整數 | 8個字節 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
示例:
1 create table tb_emp1 ( 2 id int(11), 3 name varchar(25), 4 deptId int(11), 5 salary float 6 );id字段的數據類型為int(11),后面的數字11是該數據類型指定的顯示寬度,是指定能夠顯示的數值中數字的個數。
顯示寬度和數據類型的取值范圍無關。顯示寬度只是指明了mysql最大可能顯示的數字個數。數值的位數小于指定的寬度則會由空格填充;
如果插入了大于顯示寬度的值,只要該值不超過該類型整數的取值范圍,數值仍可以插入。
如果不指定顯示寬度,則系統會為每一種類型指定默認的寬度值。示例:
1 create table tmp1 ( 2 x tinyint, 3 y samllint, 4 z mediumint, 5 m int, 6 n bigint 7 ); 1 desc tmp1;系統添加的默認顯示寬度可以保證取到取值范圍內的所有值。
浮點數類型和定點數類型
| 類型名稱 | 說明 | 存儲需求 |
| float | 單精度浮點數 | 4個字節 |
| double | 雙精度浮點數 | 8個字節 |
| decimal(M,D), dec | 壓縮的嚴格定點數 | M+2個字節 |
decimal不同于float和double,decimal是以串存放的,decimal可能的最大取值范圍和double一樣,但其有效的取值范圍由M和D決定。
decimal的存儲空間并不是固定的,而是由M決定的。不論是定點還是浮點類型,用戶指定的精度超出精度范圍,則會四舍五入進行處理。示例:
1 create table tmp2 ( 2 x float(5,1), 3 y double(5,1), 4 z decimal(5,1) 5 );向其中插入數據
1 insert into table values (5.12, 5.15, 5.123);會出現警告,float和double在四舍五入不會警告,但是decimal會。
show warnings;
float和double如果不指定精度,會按照實際的精度(由計算機硬件和操作系統共同決定),而decimal如不指定則默認為(10,0)。
mysql中,定點數是以字符串的形式存儲,如果對精度的要求比較高,使用decimal比較好,另外兩個浮點數在進行加減法和比較運算時也容易出問題。
使用浮點數要盡量避免做比較運算。
日期與時間類型
| 類型名稱 | 日期格式 | 日期范圍 | 存儲需求 |
| year | yyyy | 1901~2015 | 1字節 |
| time | hh:mm:ss | -838:59:59~838:59:59 | 3字節 |
| date | yyyy-mm-dd | 1000-01-01~9999-12-3 | 3字節 |
| datetime | yyyy-mm-dd hh:mm:ss | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8字節 |
| timestamp | yyyy-mm-dd hh:mm:ss | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4字節 |
year
year是一個用來表示年份的單字節類型。
以4位數字或者字符來表示,范圍為'1901~2155',輸入格式為'YYYY'或者YYYY。
如果只輸入兩位字符則會分別被轉換,'00'~'69'轉換為2000~2069,'70'~'99'被轉換為1970~1999,'0'和'00'的轉換相同。
超過了取值范圍,均轉換為2000,呵呵,超過了范圍明明就error了。輸入兩位數字的或區別在于0。數字格式的0將變為0000,而字符則會轉換為2000。
time
格式為'HH:MM:SS',需要3個字節,范圍為-838:59:59~838:59:59,小時部分如此大是因為time不僅可以表示一天的時間,還可以是時間間隔。
如果沒有冒號,則mysql覺得最右邊兩位是秒,不是當天的時間,而是過去了的時間。如果有冒號則肯定是一天中的時間。向表中插入系統時間:
1 insert into tmp4 values (current_time),(now());date
僅需要日期,不需要小時和分秒,需要3個字節。
1 insert into tmp4 values (current_date),(now());current_time只返回當前時間,current_date只返回當前日期,now()返回日期和時間值。
datetime
需要同時包含日期和時間信息,要8個字節
timestamp
timestamp顯示的格式和datetime相同,顯示寬度固定在19個字符,需要4個字節,取值范圍比datetime要小。
timestamp的值是以世界標準時間存儲的,存取時對當前時區進行轉換。
set time_zone='+10:00'
向datetime或者timestamp分配date對象的值,則時間部分均為'00:00:00'
字符串類型
字符串類型除了可以儲存字符串類型之外,還可以存儲圖片和聲音的二進制數據。
字符串可以進行區分或者不區分大小寫的比較,還可以模糊查找。
| 類型名稱 | 說明 | 存儲需求 |
| char(M) | 固定長度非二進制字符串 | M字節,1<=M<=255 |
| varchar(M) | 變長非二進制字符串 | L+1字節,在此L<=M和1<=M<=255 |
| tinytext | 非常小的非二進制字符串 | L+1字節,L<2^8 |
| text | 小的二進制字符串 | L+2字節,L<2^16 |
| mediumtext | 中等大小的二進制字符串 | L+3字節,L<2^24 |
| longtext | 大的二進制字符串 | L+4字節,L<2^32 |
| enum | 枚舉類型,只能有一個枚舉字符串值 | 1或2個字節,取決于枚舉值的數目 |
| set | 字符串對象可以有0個或者多個set成員 | 1,2,3,4或8,取決于集合成員的數量 |
varchar,blob和text類型為變長類型,其存儲需求取決于列值的實際長度而不是取決于最大的可能取值。
char和varchar
char(M)為固定長度字符串,在定義時指定字符串列長,右側的空格會被刪除。
varchar的實際空間要看存的字符有多長,而且保留右側多的空格。
1 select concat('(',ch,')'),concat('(',vch,')') from tmp8;ch在保存'ab? '時刪除了最后的兩個空格,而vch則會保留。
text
保存非二進制字符串,不會刪除尾部空格
enum
enum是用來存儲枚舉值的,字段名 enum('值1', '值2', ... , '值n')
取值時只能在指定的枚舉列表中取,而且一次只能取1個,如果創建的成員中有空格時,將自動的刪除空格。
enum的值在內部用整數表示,每個枚舉值均有一個索引值,從1開始編號,最多枚舉65535個元素
enum('first', 'second', 'third')
| 值 | 索引 |
| null | null |
| '' | 0 |
| first | 1 |
| second | 2 |
| third | 3 |
示例:
1 create table tmp9 (enm enum('first', 'second', 'third')); 2 insert into tmp9 values ('first'), ('second'), ('third'), (null); 3 select enm, enm+0 from tmp9;目測不能插入'',enum列總有一個默認的值,如果將enum列聲明為null,null則為該列的一個有效值,并且默認為null。
如果enum列被聲明為not null,則默認值為列表的第一個元素。enum中的值都是以編號存在的。插入編號值和插入枚舉值的效果是一樣的。
set
set是一個字符串對象,可以有一個或者是多個值,最多有64個成員。
set('值1', '值2', ... , '值n')。如果set字段中列值又重復,則mysql會自動的刪除重復的值
插入的set字段值順序并不重要,存入時會按照定義的順序顯示;如果插入了不正確的值,將會報錯。
轉載于:https://www.cnblogs.com/tuhooo/p/5442722.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的MySQL数据类型和运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sed行处理详解(交换行,合并行,删除行
- 下一篇: Win10 UWP开发系列:使用VS20