MySQL-data_type數據類型mysql
一、查看數據類型sql
mysql> help data type //經過help對數據進行查看,以及使用的方法shell
二、MySQL常見的數據類型數據庫
整數int、定點小數dec、浮點數float、字符串varchar、時間-時區、布爾bool、位vim
前言========================================session
在MySQL數據庫中,進行數據存儲時,不免會出現數據類型轉換,其中就包括:隱式類型轉換、顯示類型轉換ide
一、隱式類型轉換:有害、無害函數
①對於新建表列spa
數字:int、decimal操作系統
字符串:varchar
日期:date
②查select、增insert時,對於常量
數字:不要加引號(非必定)
字符串:必定要加上引號
日期:能夠加上引號,也能夠不加---最好是加上
二、顯式類型轉換:調用cast函數
格式:
cast(expr as type)
---將任意類型的表達式expr轉換成指定類型type的值
mysql> select cast(19950101 as date); +------------------------+
| cast(19950101 as date) |
+------------------------+
| 1995-01-01 |
+------------------------+
常見的類型轉換:
字符串char--->數字、日期
數字--->字符串、日期
日期date--->數字、字符串
===========================================
經常使用的數據類型:
每一個整型類型能夠指定一個最小顯示寬度(注意:這個寬度並不表示存儲的值有多大)
基本格式:
INT[(M)] [UNSIGNED] [ZEROFILL]
①M:指定顯示寬度(默認是M=10),以實際的取值範圍爲準,值超過顯示寬度,顯示寬度自動增長
②unsigned:無符號的,表示只容許正數,因此取值範圍取絕對值且最大值*2
(例:int unsigned range is 0 to 4294967295)
③zerofill: 填充0(若是聲明瞭zerofill,該列會自動設爲unsigned)
影響數字的顯示方式:
若是一個數字的寬度小於所容許的最大寬度,這個值前面會用0填充
若是寬度大於所容許的最大寬度但不超過取值範圍,以實際的取值範圍爲準,不填0;超出取值範圍的報錯不存儲。
示例:
mysql> create table t1(id int zerofill); #默認顯示寬度10 mysql> insert into t1 values(-1); #取值範圍:0--4294967295 ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into t1 values(123); mysql> insert into t1 values(12300); mysql> insert into t1 values(1.123); mysql> select * from t1; +------------+
| id |
+------------+
| 0000000123 |
| 0000012300 |
| 0123456789 |
| 0000000001 |
+------------+
解析:由於建表的設置是int整數,小數點後的數會四捨五入
2、(定點)小數: decimal(dec)精確小數類型---精確數的存儲
同義詞:decimal=dec=numeric=fixed
基本格式:
DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
①M:精度,(整數位數+小數位數)不包含小數點的數字總位數(1--30),不指定默認爲10
②D:小數位數,若是不指定,默認爲0
若位數不夠,小數末尾補零;若位數超預算(整數位數=M-D),報錯。
示例:
mysql> create table t2(id dec(5,3) unsigned); ##數字總位數5 ##整數位數5-3=2(不夠不要緊;超出報錯) ##小數位數3(不夠補零;超出四捨五入) mysql> insert into t2 values(12.345); mysql> insert into t2 values(1.23); mysql> insert into t2 values(123); ERROR 1264 (22003): Out of range value for column 'id' at row 1 mysql> insert into t2 values(12.3456);
mysql> select * from t2; +--------+
| id |
+--------+
| 12.345 |
| 1.230 |
| 12.346 |
+--------+
dec的小數位數是個定數;
3、浮點數: float/double單精度、雙精度浮點類型
基本格式:
float[(length) | (<display width>,<scale>)]
double[(precision) | (<display width>,<scale>)]
二者區別在於值所保留的存儲空間數量不一樣
注意:
因爲對一個浮點數字來講,可用的存儲空間有限,若是一個數字很是大或很是小,將存儲這個數字的近似值而不是實際值。
①使用一個參數來指定浮點類型
length(precision):在一個浮點數據類型中能夠指定長度,來肯定具體的浮點類型
0~24:單精度float,從第7位有效位,進行四捨五入存儲
25~30:雙精度double,從第16位有效位,進行四捨五入存儲
mysql> create table t3(id float(8)); //m=8,說明是單精度,存儲6位的近似值(第7位四捨五入,後面爲0)
mysql> insert into t3 values(123); mysql> insert into t3 values(1234567); mysql> insert into t3 values(123456789); mysql> insert into t3 values(123456789.123456789); mysql> select * from t3; +-----------+
| id |
+-----------+
| 123 |
| 1234570 |
| 123457000 |
| 123457000 |
+-----------+
②使用兩個參數來指定浮點類型
單精度float(m,d):m表示精度(0~24),d表示小數位數
雙精度double(m,d):m表示精度(25~30),d表示小數位數
具備寬度和小數位數的float的同義詞:real和float4;指定double=float(30)
示例:設一個字段定義爲float(5,3)---單精度浮點,精度5,小數位3(和dec同樣)
mysql> create table t_3(id float(5,3) unsigned); ##數字總位數5 ##整數位數5-3=2(不夠不要緊;超出報錯) ##小數位數3(不夠補零;超出四捨五入) mysql> insert into t_3 values(123); ERROR 1264 (22003): Out of range value for column 'id' at row 1 mysql> insert into t_3 values(12.3); mysql> insert into t_3 values(12.3456); mysql> insert into t_3 values(1.23456); mysql> select * from t_3; +--------+
| id |
+--------+
| 12.300 |
| 12.346 |
| 1.235 |
+--------+
float的小數位數不是固定的;
超出存儲範圍,近似值進行存儲。
1.char(n):固定長度,最多255個字符
2.varchar(n):固定長度,最多65535個字符
3.tinytext:可變長度,最多255個字符
4.text:可變長度,最多65535個字符
5.mediumtext:可變長度,最多2的24次方-1個字符
6.longtext:可變長度,最多2的32次方-1個字符
示例:
mysql> create table t4(name varchar(21));
mysql> insert into t4 values(123); mysql> insert into t4 values(xiaoming); ERROR 1054 (42S22): Unknown column 'xiaoming' in 'field list' #字符串要用引號引發來 mysql> insert into t4 values('xiaoming'); mysql> insert into t4 values('zhang'san');
'> ^C !!!字符串中的單引號用單引號進行轉義 mysql> insert into t4 values('zhang''san'); mysql> select * from t4; +-----------+
| name |
+-----------+
| 123 |
| xiaoming |
| zhang'san |
+-----------+
若要存儲中文字符串,須要進行字符設置
create table tableName(列名 varchar(20) character set utf8);
create table tableName(列名 varchar(20) character set gpk);
一、char和varchar的區別:
①char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。因此char類型存儲的字符串末尾不能有空格,varchar不限於此。
②char(n) 固定長度,char(4)不論是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),因此varchar(4),存入3個字符將佔用4個字節。
③char類型的字符串檢索速度要比varchar類型的快。
二、varchar和text的區別:
①varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。
②text類型不能有默認值。
③varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text,在都建立索引的狀況下,text的索引彷佛不起做用。
date:日期 '2008-12-02'
time:時間 '12:25:36'
datetime:日期時間 '2008-12-12 22:06:44'
timestamp:自動存儲記錄修改時間(若是數據庫裏面有timestamp數據類型,就應該考慮時區問題)
示例:
mysql> create table t5(d1 date);
mysql> insert into t5 values(19901101); #推薦的正統寫法 mysql> insert into t5 values(901101); mysql> insert into t5 values(1990111); #有問題的寫法 mysql> select * from t5; +------------+
| d1 |
+------------+
| 1990-11-01 |
| 1990-11-01 |
| 0199-01-11 |
+------------+
1、得到當前日期時間的函數
①得到當前日期+時間(date+time)函數:now()、sysdate()
區別:now()在執行開始時值就獲得了,sysdate()在函數執行時動態獲得值
②得到當前日期curdate()、得到當前時間curtime()
mysql> select curdate(),curtime(); +------------+-----------+ | curdate() | curtime() | +------------+-----------+ | 2017-03-21 | 11:00:25 | +------------+-----------+
========================================
1)日期字符串轉換函數format:
date_format(date,format)
---將日期date按照給定的模式format轉換成字符串
time_format(time,format)
---將時間time按照給定的模式format轉換成字符串,format中只可使用時、分、秒、微秒模式元素
format中可以使用的模式元素可查官方文檔
2)日期字符串轉換函數
str_to_date(str,format)
---將字符串str以指定的模式format轉換成日期
mysql> select str_to_date('01,5,2013','%d,%m,%Y');
mysql> select str_to_date('May 1, 2013','%M %d,%Y');
若是在會話變量@@sql_mode設置中包含no_zero_date和no_zero_in_date時,上述轉換將會失敗,沒有包含這些設置時則轉換成功。
========================================
③得到當前 UTC 日期時間函數:utc_date(), utc_time(), utc_timestamp()
2、MySQL時區問題:重點!!!
注意:當數據庫裏面有timestamp數據類型的列,就應該考慮時區參數
問:如何判斷是否有timestamp數據類型的列?
答:
mysql> select table_name,column_name,data_type
-> from information_schema.columns
-> where
-> data_type='timestamp';
……
MySQL是安裝在Linux操做系統下面,所以MySQL時區跟Linux的時區有不少關聯的地方,MySQL裏有一個時區叫作系統時區,MySQL系統時區的存在是爲MySQL安裝後讀取Linux操做系統的時區,將本身的系統時區設置爲與Linux操做系統一致 的時區:
mysql> show variables like "system_time%"; #查看系統時區
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | CST |
+------------------+-------+
Linux 操做系統的時區(有不少選擇)與 mysql 中的系統時區是一致的:
Linux操做系統的時區
shell> cat /etc/sysconfig/clock
區域信息目錄:/usr/share/zoneinfo
系統時區的選擇對後續 mysql 的操做影響不大,可是,MySQL中的time_zone的全局時區,會對咱們的MySQL產生影響:
mysql> show variables like "time_zone%"; #查看數據庫時區
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| time_zone | SYSTEM |
+------------------+--------+
問:爲何說time_zone正確與否會對MySQL產生影響?(也就是timestamp列的工做過程)
答:
①當有timestamp列是,一個會話鏈接上來,這個會話默認的時區就等於time_zone的時區,固然會話時區也能夠被修改。
②往timestamp列裏存數據的時候,mysql會先查詢存數據的會話所在的時區,mysql把會話對應的時區與存儲的時間結合換算出時間所對應的0時區,再把這個時間存儲到timestamp列中,因此timestamp列存儲都是相對於0時區的時間。
③當用戶查詢數據的時候,mysql會將timestamp列中相對應於0時區的數據轉換成會話對應的時區,反應給用戶。
④當會話對應的時區與存儲時間的時區不對應時,存儲的時間仍然會被轉換爲0時區對應的時間進行存儲,那麼這時咱們存儲的時間就是錯誤的,因此咱們必須保證會話時區與存儲時間的時區一致。
mysql> select @@global.time_zone; #查看全局時區
mysql> select @@session.time_zone; #查看會話時區(默認等於全局時區)
1.臨時設置時區(全局):
①'+8:00'格式
mysql> set @@global.time_zone='+8:00';
②'Asia/Shanghai'格式
mysql> set @@global.time_zone='Asia/Shanghai';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Shanghai'
加載系統時區:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo |mysql -uroot -p123 mysql
mysql> set @@global.time_zone='Asia/Shanghai';
2.永久設置時區:
修改配置文件vim /etc/my.cnf
[mysqld]區域中添加default_time_zone=Asia/Shanghai
時區的正確實踐(只有timestamp數據類型的纔有意義):
①insert之前,你的values對應的時間究竟是哪一個時區,而後設置set @@session.time_zone爲對應的時區
②select獲取之前,你想獲得什麼時區的時間,就設置set @@session.time_zone爲對應的時區。
示例:
會話1:當前會話
mysql> select @@global.time_zone; +--------------------+
| @@global.time_zone |
+--------------------+
| +08:00 |
+--------------------+ mysql> create table t9(tm timestamp); mysql> insert into t9 values('2017-3-22 10:10'); mysql> select * from t9; +---------------------+
| tm |
+---------------------+
| 2017-03-22 10:10:00 |
+---------------------+
會話2:客戶端登陸會話(東10區用戶)
設置會話時區
mysql> set @@session.time_zone='+10:00'; mysql> use test; select * from t9; Database changed +---------------------+
| tm |
+---------------------+
| 2017-03-22 12:10:00 |
+---------------------+
A value of zero is considered false,nonzero values are considered true.
示例:
mysql> create table t7(num bool); mysql> insert into t7 values(true); mysql> insert into t7 values(false); mysql> insert into t7 values(123); mysql> insert into t7 values(1); mysql> insert into t7 values(0); mysql> insert into t7 values(128); #範圍在-128~127 ERROR 1264 (22003): Out of range value for column 'num' at row 1 mysql> select * from t7; +------+
| num |
+------+
| 1 |
| 0 |
| 123 |
| 1 |
| 0 |
+------+
位主要是用來存放二進制數,select查詢默認顯示10進制,可使用bin()、hex()函數來進行查詢
bin()---顯示二進制格式
hex()---顯示十六進制格式
示例:
mysql> create table t7(id bit(4)); mysql> insert into t7 values(2); mysql> insert into t7 values(13); mysql> select bin(id),hex(id) from t7; +---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 10 | 2 |
| 1101 | D |
+---------+---------+