你那num1是個變量

東風(fēng)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
但用雙引號引起來的時候,就比如
"+num1+" --這樣并帶著+號就代表這是個變量,而不是個字符串
那個ip你看跟這個num1不太一樣,因?yàn)閕p是字符型,所以外邊多了一對單引號
至于后邊的9,'10.108.29.153' ……
9是整型,所以不加引號
而后邊這個ip地址是字符型,所以加單引號
MySQL 數(shù)據(jù)類型細(xì)分下來,大概有以下幾類:
數(shù)值,典型代表為 tinyint,int,bigint
浮點(diǎn)/定點(diǎn),典型代表為 float,double,decimal 以及相關(guān)的同義詞
字符串,典型代表為 char,varchar
時間日期,典型代表為 date,datetime,time,timestamp
二進(jìn)制,典型代表為 binary,varbinary
位類型
枚舉類型
集合類型
大對象,比如 text,blob
json 文檔類型
一、數(shù)值類型(不是數(shù)據(jù)類型,別看錯了)如果用來存放整數(shù),根據(jù)范圍的不同,選擇不同的類型。
以上是幾個整數(shù)選型的例子。整數(shù)的應(yīng)用范圍最廣泛,可以用來存儲數(shù)字,也可以用來存儲時間戳,還可以用來存儲其他類型轉(zhuǎn)換為數(shù)字后的編碼,如 IPv4 等。示例 1用 int32 來存放 IPv4 地址,比單純用字符串節(jié)省空間。表 x1,字段 ipaddr,利用函數(shù) inet_aton,檢索的話用函數(shù) inet_ntoa。
查看磁盤空間占用,t3 占用最大,t1 占用最小。所以說如果整數(shù)存儲范圍有固定上限,并且未來也沒有必要擴(kuò)容的話,建議選擇最小的類型,當(dāng)然了對其他類型也適用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 3.0G3541825 861M -rw-r----- 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r----- 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r----- 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd
二、浮點(diǎn)數(shù) / 定點(diǎn)數(shù)先說?浮點(diǎn)數(shù),float 和 double 都代表浮點(diǎn)數(shù),區(qū)別簡單記就是 float 默認(rèn)占 4 Byte。float(p) 中的 p 代表整數(shù)位最小精度。如果 p 24 則直接轉(zhuǎn)換為 double,占 8 Byte。p 最大值為 53,但最大值存在計(jì)算不精確的問題。再說?定點(diǎn)數(shù),包括 decimal 以及同義詞 numeric,定點(diǎn)數(shù)的整數(shù)位和小數(shù)位分別存儲,有效精度最大不能超過 65。所以區(qū)別于 float 的在于精確存儲,必須需要精確存儲或者精確計(jì)算的最好定義為 decimal 即可。示例 3創(chuàng)建一張表 y1,分別給字段 f1,f2,f3 不同的類型。mysql-(ytt/3305)-create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)
三、字符類型字符類型和整形一樣,用途也很廣。用來存儲字符、字符串、MySQL 所有未知的類型。可以簡單說是萬能類型!
char(10) 代表最大支持 10 個字符存儲,varhar(10) 雖然和 char(10) 可存儲的字符數(shù)一樣多,不同的是 varchar 類型存儲的是實(shí)際大小,char 存儲的理論固定大小。具體的字節(jié)數(shù)和字符集相關(guān)。示例 4例如下面表 t4 ,兩個字段 c1,c2,分別為 char 和 varchar。mysql-(ytt/3305)-create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)
所以在 char 和 varchar 選型上,要注意看是否合適的取值范圍。比如固定長度的值,肯定要選擇 char;不確定的值,則選擇 varchar。
四、日期類型日期類型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte。
time,timestamp,datetime 在不包含小數(shù)位時分別占用 3 Byte,4 Byte,8 Byte;小數(shù)位部分另外計(jì)算磁盤占用,見下面表格。
請點(diǎn)擊輸入圖片描述
請點(diǎn)擊輸入圖片描述
請點(diǎn)擊輸入圖片描述
注意:timestamp 代表的時間戳是一個 int32 存儲的整數(shù),取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
綜上所述,日期這塊類型的選擇遵循以下原則:
1. 如果時間有可能超過時間戳范圍,優(yōu)先選擇 datetime。2. 如果需要單獨(dú)獲取年份值,比如按照年來分區(qū),按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨(dú)獲取日期或者時間,最好是單獨(dú)存放,而不是簡單的用 datetime 或者 timestamp。后面檢索時,再加函數(shù)過濾,以免后期增加 SQL 編寫帶來額外消耗。
4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字符類型來代替。MySQL 內(nèi)部的類型轉(zhuǎn)換對資源額外的消耗也是需要考慮的。
示例 5
建立表 t5,對這些可能需要的字段全部分離開,這樣以后寫 SQL 語句的時候就很容易了。
當(dāng)然了,這種情形占用額外的磁盤空間。如果想在易用性與空間占用量大這兩點(diǎn)來折中,可以用 MySQL 的虛擬列來實(shí)時計(jì)算。比如假設(shè) c5 字段不存在,想要得到 c5 的結(jié)果。mysql-(ytt/3305)-alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 ?Duplicates: 0 ?Warnings: 0
五、二進(jìn)制類型
binary 和 varbinary 對應(yīng)了 char 和 varchar 的二進(jìn)制存儲,相關(guān)的特性都一樣。不同的有以下幾點(diǎn):
binary(10)/varbinary(10) 代表的不是字符個數(shù),而是字節(jié)數(shù)。
行結(jié)束符不一樣。char 的行結(jié)束符是 \0,binary 的行結(jié)束符是 0x00。
由于是二進(jìn)制存儲,所以字符編碼以及排序規(guī)則這類就直接無效了。
示例 6
來看這個 binary 存取的簡單示例,還是之前的變量 @a。
切記!這里要提前計(jì)算好 @a 占用的字節(jié)數(shù),以防存儲溢出。
六、位類型
bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進(jìn)制方式存儲,一般用來存儲狀態(tài)類的信息。比如,性別,真假等。具有以下特性:
1. 對于 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進(jìn)制來過濾數(shù)據(jù)。3. 如果此字段加上索引,MySQL 不會自己做類型轉(zhuǎn)換,只能用二進(jìn)制來過濾。
示例 7
創(chuàng)建表 c1, 字段性別定義一個比特位。mysql-(ytt/3305)-create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)-select cast(gender as unsigned) ?'f1' from c1;+------+| f1 ? |+------+| ? ?0 || ? ?1 |+------+2 rows in set (0.00 sec)
過濾數(shù)據(jù)也一樣,二進(jìn)制或者直接十進(jìn)制都行。mysql-(ytt/3305)-select conv(gender,16,10) as gender \???- from c1 where gender = b'1';?+--------+| gender |+--------+| 1??????|+--------+1 row in set (0.00 sec)????mysql-(ytt/3305)-select conv(gender,16,10) as gender \????- from c1 where gender = '1';+--------+| gender |+--------+| 1??????|+--------+1 row in set (0.00 sec)
其實(shí)這樣的場景,也可以定義為 char(0),這也是類似于 bit 非常優(yōu)化的一種用法。
mysql-(ytt/3305)-create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)
那現(xiàn)在我給表 c1 簡單的造點(diǎn)測試數(shù)據(jù)。
mysql-(ytt/3305)-select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)
把 c1 的數(shù)據(jù)全部插入 c2。
mysql-(ytt/3305)-insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 ?Duplicates: 0 ?Warnings: 0
兩張表的磁盤占用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd
檢索方式稍微有些不同,不過效率也差不多。所以說,字符類型不愧為萬能類型。
七、枚舉類型
枚舉類型,也即 enum。適合提前規(guī)劃好了所有已經(jīng)知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:
1. 最大占用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 后臺存儲以下標(biāo)的方式,也就是 tinyint 或者 smallint 的方式,下標(biāo)從 1 開始。4. 排序時按照下標(biāo)排序,而不是按照里面元素的數(shù)據(jù)類型。所以這點(diǎn)要格外注意。
示例 8
創(chuàng)建表 t7。mysql-(ytt/3305)-create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)
八、集合類型
集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點(diǎn):
1. 最大占用 8 Byte,int64。2. 內(nèi)部以二進(jìn)制位的方式存儲,對應(yīng)的下標(biāo)如果以十進(jìn)制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復(fù)元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標(biāo)為 1 和 2 的可以一起插入,直接插入 3 即可。
示例 9
定義表 c7 字段 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。
mysql-(ytt/3305)-create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)
插入 1 到 128 的所有組合。
mysql-(ytt/3305)-INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( ? ? ? ?SELECT 1 AS cnt ? ? ? ?UNION ALL ? ? ? ?SELECT cnt + 1 ? ? ? ?FROM ytt_number ? ? ? ?WHERE cnt pow(2, 7) ? ?)SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 ?Duplicates: 0 ?Warnings: 0
九、數(shù)據(jù)類型在存儲函數(shù)中的用法
函數(shù)里除了顯式聲明的變量外,默認(rèn) session 變量的數(shù)據(jù)類型很弱,隨著給定值的不同隨意轉(zhuǎn)換。
示例 10
定義一個函數(shù),返回兩個給定參數(shù)的乘積。定義里有兩個變量,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。
簡單調(diào)用下。
mysql-(ytt/3305)-select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result ? ? ? ? ? ? ? ? ? |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)
總結(jié)
本篇把 MySQL 基本的數(shù)據(jù)類型做了簡單的介紹,并且用了一些容易理解的示例來梳理這些類型。我們在實(shí)際場景中,建議選擇適合最合適的類型,不建議所有數(shù)據(jù)類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。
方法一: CAST('123' AS SIGNED);
方法二: CONVERT('123',SIGNED);
方法三: '123'+0; // 強(qiáng)制隱形轉(zhuǎn)換
查看 /proc/meminfo
Tips:
“大內(nèi)存頁”也稱傳統(tǒng)大頁、大頁內(nèi)存等有助于 Linux 進(jìn)行虛擬內(nèi)存的管理,標(biāo)準(zhǔn)的內(nèi)存頁為 4KB,這里使用“大內(nèi)存頁”最大可以定義 1GB 的頁面大小,在系統(tǒng)啟動期間可以使用“大內(nèi)存頁”為應(yīng)用程序預(yù)留一部分內(nèi)存,這部分內(nèi)存被占用且永遠(yuǎn)不會被交換出內(nèi)存,它會一直保留在那里,直到改變配置。(詳細(xì)介紹請看下面鏈接官方解釋)
那么這么大頁內(nèi)存是分配給誰的呢?
查詢一下:
shell /proc/sys/vm/hugetlb_shm_group
27
shell id 27
uid=27(mysql) gid=27(mysql) groups=27(mysql)
hugetlb_shm_group 文件里填的是指定大頁內(nèi)存使用的用戶組 id,這里查看到是 MySQL 組 id,那既然是給 MySQL 的為什么 free 等于 total,并且 mysql 還只有 20 多 G 實(shí)際使用內(nèi)存呢?
原來在 MySQL 中還有專門啟用大內(nèi)存頁的參數(shù),在 MySQL 大內(nèi)存頁稱為 large page。
查看 MySQL 配置文件
發(fā)現(xiàn)配置文件中確實(shí)有 large-page 配置,但出于禁用狀態(tài)。
后與業(yè)務(wù)確認(rèn),很早之前確實(shí)啟用過 mysql 的 large page,不過后面禁用了。排查到這基本就有了結(jié)論。
結(jié)論
這套環(huán)境之前開啟了 20000 的大內(nèi)存頁,每頁大小為 2MB,占用了 40G 內(nèi)存空間,給 MySQL 使用,并且 MySQL 開啟了 large page,但后來不使用的時候,只關(guān)閉了 MySQL 端的 large page 參數(shù),但沒有實(shí)際更改主機(jī)的關(guān)于大內(nèi)存頁的配置,所以導(dǎo)致,實(shí)際上主機(jī)上的還存在 20000 的大內(nèi)存頁,并且沒在使用,這一部分長期空閑,并且其他程序不能使用。
所以 MySQL 在使用 20G 內(nèi)存左右,整個主機(jī)內(nèi)存就飽和了,然后在部分條件下,就觸發(fā)了 OOM,導(dǎo)致 mysqld 被 kill,但主機(jī)上又有 mysqld_safe 守護(hù)程序,所以又再次給拉起來,就看到了文章初的偶爾連接不上的現(xiàn)象。
long是32位的,在數(shù)據(jù)庫中可以用bigint或者numeric(x,y),x是長度,y是小數(shù)點(diǎn)后面的位數(shù)
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函數(shù)可用來獲取一個類型的值,并產(chǎn)生另一個類型的值。
這個類型 可以是以下值其中的 一個:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
示例:
select cast(1.1 as int)--------------1
分享名稱:mysql怎么存大整形,mysql 整形長度
網(wǎng)頁鏈接:http://chinadenli.net/article5/dsieeii.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、微信小程序、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)