MySQL經常使用數據類型

MySQL-data_type數據類型mysql

一、查看數據類型sql

mysql> help data type    //經過help對數據進行查看,以及使用的方法shell

二、MySQL常見的數據類型數據庫

  整數int定點小數dec浮點數float字符串varchar時間-時區布爾boolvim

 

前言========================================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--->數字、字符串

===========================================

 

經常使用的數據類型:

1、整數:

  每一個整型類型能夠指定一個最小顯示寬度(注意:這個寬度並不表示存儲的值有多大)

基本格式:

  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的小數位數不是固定的;

超出存儲範圍,近似值進行存儲。 

 

 

4、字符串:  varchar可變長字符串類型

  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的索引彷佛不起做用。

 

 

5、日期時間時區

  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 |
+---------------------+ 

 

 

6、布爾bool或boolean=tinyint(1)

  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 |
+------+

 

 

7、位

  位主要是用來存放二進制數,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       |
+---------+---------+
相關文章
相關標籤/搜索