MySQL常用數據類型 length 專題


 

MySQL-data_type數據類型

1、查看數據類型

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

2、MySQL常見的數據類型

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

 

前言========================================

在MySQL數據庫中,進行數據存儲時,難免會出現數據類型轉換,其中就包括:隱式類型轉換、顯示類型轉換

1、隱式類型轉換:有害、無害

①對於新建表列

  數字:int、decimal

  字符串:varchar

  日期:date

②查select、增insert時,對於常量

  數字:不要加引號(非一定)

  字符串:一定要加上引號

  日期:可以加上引號,也可以不加---最好是加上

2、顯式類型轉換:調用cast函數

格式:

  cast(expr as type)

  ---將任意類型的表達式expr轉換成指定類型type的值

mysql> select cast(19950101 as date);
+------------------------+
| cast(19950101 as date) |
+------------------------+
| 1995-01-01             |
+------------------------+

常見的類型轉換:

  字符串char--->數字、日期

  數字--->字符串、日期

  日期date--->數字、字符串

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

常用的數據類型:

一、整數:

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

tinyint
從 -2^7 (-128) 到 2^7 - 1 (123) 的整型數據。存儲大小為 1 個字節。
unsigned 是從 0 到 255 的整型數據。
所以建表的時候 只能是tinyint(3),哪怕你建tinyint(100),他最大還是3位這么多。

smallint
從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型數據。存儲大小為 2 個字節。
unsigned 是從 0 到 65535 的整型數據。
所以建表的時候 只能是smallint(5),哪怕你建smallint(100),他最大還是5位這么多。

int
從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字).存儲大小為 4 個字節。
unsigned 是從 0 到 4294967296 的整型數據。
所以建表的時候 只能是int(10),哪怕你建int(100),他最大還是10位這么多。

bigint
從 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整型數據(所有數字)。存儲大小為 8 個字節。
unsigned 是(自己算吧)
所以建表的時候 只能是bigint(20),哪怕你建bigint(100),他最大還是20位這么多。

 

 

基本格式:

  INT[(M)] [UNSIGNED] [ZEROFILL]

①M:指定顯示寬度(默認是M=10),以實際的取值范圍為准,值超過顯示寬度,顯示寬度自動增加 【小結一下,如果設置ZEROFILL,則會按照設置的length來補0,如果超過設置的length,則不需要補0】

②unsigned:無符號的,表示只允許正數,所以取值范圍取絕對值且最大值*2

    (例:int unsigned range is 0 to 4294967295)

③zerofill: 填充0(如果聲明了zerofill,該列會自動設為unsigned)

 

影響數字的顯示方式:

  如果一個數字的寬度小於所允許的最大寬度,這個值前面會用0填充

  如果寬度大於所允許的最大寬度但不超過取值范圍,以實際的取值范圍為准,不填0;超出取值范圍的報錯不存儲【MariaDB中超出后,數據會異常,但insert不會報錯】

示例:

MariaDB [test]> CREATE TABLE `t1` (  `id` int(9) unsigned zerofill DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.02 sec)

MariaDB [test]>
MariaDB [test]>
MariaDB [test]> insert into t1 values(1.123);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(123);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(12300);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(1234567890);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]>
MariaDB [test]> select * from t1;
+------------+
| id         |
+------------+
|  000000001 |
|  000000123 |
|  000012300 |
| 1234567890 |
+------------+
4 rows in set (0.00 sec)

MariaDB [test]> insert into t1 values(12345678901);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> insert into t1 values(-1);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> select * from t1;
+------------+
| id         |
+------------+
|  000000001 |
|  000000123 |
|  000012300 |
| 1234567890 |
| 4294967295 |
|  000000000 |
+------------+
6 rows in set (0.00 sec)

MariaDB [test]>

 

 

 

 

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整數,小數點后的數會四舍五入

 

二、(定點)小數:  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的小數位數是個定數;

 

三、浮點數:  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的小數位數不是固定的;

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

 

 

四、字符串:  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);

 

1、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類型的快。

 

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

 

 

六、布爾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 |
+------+

 

 

七、位

位主要是用來存放二進制數,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       |
+---------+---------+ 
@author:http://www.cnblogs.com/geaozhang/

 

https://www.cnblogs.com/geaozhang/p/6718773.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM