欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

MySQL數(shù)值類型溢出處理

推薦閱讀吊打面試官!MySQL靈魂100問,你能答出多少?

潞州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

來(lái),考考大家一個(gè)問題,在 MySQL 中當(dāng)某一列設(shè)置為 int(0) 時(shí)會(huì)發(fā)生什么 ?

為了演示這個(gè)問題,我們先要?jiǎng)?chuàng)建一個(gè)表

 DROP TABLE IF EXISTS `na`;
CREATE TABLE `na` (
  n1 INT(0)  NOT NULL DEFAULT '0',
  n2 INT(11) NOT NULL DEFAULT '0'
);

然后我們使用下面的語(yǔ)句往 na 表中插入一些數(shù)據(jù)

 mysql> INSERT INTO `na` VALUES(520,520),(5201314,5201314);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

最后我們讀取出來(lái)看看

 mysql> SELECT * FROM na;
+---------+---------+
| n1      | n2      |
+---------+---------+
|     520 |     520 |
| 5201314 | 5201314 |
+---------+---------+
2 rows in set (0.00 sec)

對(duì)的,好像什么都不會(huì)發(fā)生,沒什么問題才是對(duì)的,我就怕有什么問題…哈哈

我們這一章節(jié)來(lái)講講整型溢出問題。

MySQL 數(shù)值類型溢出處理

當(dāng) MySQL 在某個(gè)數(shù)值列上存儲(chǔ)超出列數(shù)據(jù)類型允許范圍的值時(shí),結(jié)果取決于當(dāng)時(shí)生效的 SQL 模式

  • 如果啟用了嚴(yán)格的 SQL 模式,則 MySQL 會(huì)根據(jù) SQL 標(biāo)準(zhǔn)拒絕帶有錯(cuò)誤的超出范圍的值,并且插入失敗
  • 如果沒有啟用任何限制模式,那么 MySQL 會(huì)將值裁剪到列數(shù)據(jù)類型范圍的上下限值并存儲(chǔ)

    1. 當(dāng)超出范圍的值分配給整數(shù)列時(shí),MySQL 會(huì)存儲(chǔ)表示列數(shù)據(jù)類型范圍的相應(yīng)端點(diǎn)的值

    2. 當(dāng)為浮點(diǎn)或定點(diǎn)列分配的值超出指定(或默認(rèn))精度和比例所隱含的范圍時(shí),MySQL 會(huì)存儲(chǔ)表示該范圍的相應(yīng)端點(diǎn)的值

這個(gè),應(yīng)該很好理解吧?

我們舉一個(gè)例子,假設(shè) t1 表的結(jié)構(gòu)如下

 CREATE TABLE t1 (
    i1 TINYINT,
    i2 TINYINT UNSIGNED
);

如果啟用了嚴(yán)格的 SQL 模式,超出范圍會(huì)發(fā)生一個(gè)錯(cuò)誤

 mysql> SET sql_mode = 'TRADITIONAL';  -- 首先設(shè)置嚴(yán)格模式
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
ERROR 1264 (22003): Out of range value for column 'i1' at row 1
mysql> SELECT * FROM t1;
Empty set (0.00 sec)

當(dāng)嚴(yán)格模式被禁用,值可以插入,但會(huì)被裁剪,并且引發(fā)一個(gè)警告

 mysql> SET sql_mode = '';  -- 禁用所有模式
mysql> INSERT INTO t1 (i1, i2) VALUES(256, 256);
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'i1' at row 1 |
| Warning | 1264 | Out of range value for column 'i2' at row 1 |
+---------+------+---------------------------------------------+
mysql> SELECT * FROM t1;
+------+------+
| i1   | i2   |
+------+------+
|  127 |  255 |
+------+------+

如果未啟用嚴(yán)格 SQL 模式,對(duì)于 ALTER TABLE, LOAD DATA INFILE, UPDATE 和多行 INSERT等語(yǔ)句會(huì)由于裁剪而發(fā)生的列分配轉(zhuǎn)換并且引發(fā)一個(gè)警告。

而如果啟用了嚴(yán)格模式,這些語(yǔ)句會(huì)直接失敗,并且未插入或更改部分或全部值,具體取決于表是否為事務(wù)表和其他因素。

數(shù)值表達(dá)式求值過(guò)程中的溢出會(huì)導(dǎo)致錯(cuò)誤,例如,因?yàn)樽畲蟮挠蟹?hào) BIGINT 值是 9223372036854775807,因此以下表達(dá)式會(huì)產(chǎn)生錯(cuò)誤

 mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

為了在這種情況下使操作成功,需要將值轉(zhuǎn)換為 unsigned

 mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+

從另一方面說(shuō),是否發(fā)生溢出取決于操作數(shù)的范圍,因此處理前一個(gè)表達(dá)式的另一種方法是使用精確值算術(shù),因?yàn)? DECIMAL 值的范圍大于整數(shù)

 mysql> SELECT 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+

整數(shù)數(shù)值之間的減去,如果其中一個(gè)類型為 UNSIGNED ,默認(rèn)情況下會(huì)生成無(wú)符號(hào)結(jié)果。如果為負(fù),則會(huì)引發(fā)錯(cuò)誤

 mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

這種情況下,如果啟用了 NO_UNSIGNED_SUBTRACTION SQL 模式,則結(jié)果為負(fù)

 mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+

如果此類操作的結(jié)果用于更新 UNSIGNED 整數(shù)列,則結(jié)果將裁剪為列類型的最大值,如果啟用了 NO_UNSIGNED_SUBTRACTION 則裁剪為 0。但如果啟用了嚴(yán)格的 SQL 模式,則會(huì)發(fā)生錯(cuò)誤并且列保持不變。

后記

一切都是套路,套路….基本都和 SQL 模式有關(guān)…

標(biāo)題名稱:MySQL數(shù)值類型溢出處理
文章源于:http://aaarwkj.com/article30/ijpsso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站改版、企業(yè)建站商城網(wǎng)站、服務(wù)器托管關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
四虎在线观看免费资源| 国产精品一区二区三区四区久久| 国产91九色视频在线| 欧美人妻不卡一区二区久久| 国产真实内射在线观看| 亚洲日本韩国三级一区| 日本韩国精品视频在线| 中文乱幕亚洲无套内射 | 久久九特黄的免费大片| 国产精品对白久久久久粗| 91手机国产三级在线| 欧美精品一区二区精品久久| 久久人妻少妇嫩草av蜜桃综合 | 精品在线中文字幕不卡| 亚洲欧美精品一区二区三区| 婷婷色中文字幕综合在线| 久久精品国产亚洲av不卡| 青青草原在线免费视频| 中文字幕精品人妻在线| 日韩中字伦理熟妇人妻| 欧美特黄高清在线观看| 91亚洲国产成人久久| 在线观看一区二区三区国产视频| 亚洲综合一区二区三区四区在线| 日韩精品不卡在线观看| 日韩av网址在线免费观看| 国产精品亚洲精品欧美| 亚洲午夜av久久乱码| 我要看黄色一级性生活片| 我要看黄色一级性生活片| 亚洲精品一区二区三区中文字幕| 中文字幕一区二区精品区| 深夜释放自己污在线看| 亚洲天堂av在线观看| 欧美精品中出一区二区三区| 婷婷国产成人精品一区二| 欧美日韩国产一下老妇| 国产精品国产三级国产专播精品| 国产av白浆一区二区色爽黄| 另类亚洲欧美专区第一页| 午夜福利院在线观看免费|