好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL數(shù)值類型溢出的處理方法

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

熱門標簽:電銷卡外呼系統(tǒng)供應(yīng)商 騰訊地圖標注提升 福建外呼系統(tǒng)定制化 美國反騷擾電話機器人 怎么在地圖標注位置生成圖片 銅陵防封電銷卡 真人語音電話機器人 悟空科技電話機器人 400電話可以免費申請嗎

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

為了演示這個問題,我們先要創(chuàng)建一個表

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

然后我們使用下面的語句往 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

最后我們讀取出來看看

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

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

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

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

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

  • 如果啟用了嚴格的 SQL 模式,則 MySQL 會根據(jù) SQL 標準拒絕帶有錯誤的超出范圍的值,并且插入失敗
  • 如果沒有啟用任何限制模式,那么 MySQL 會將值裁剪到列數(shù)據(jù)類型范圍的上下限值并存儲
    • 當(dāng)超出范圍的值分配給整數(shù)列時,MySQL 會存儲表示列數(shù)據(jù)類型范圍的相應(yīng)端點的值
    • 當(dāng)為浮點或定點列分配的值超出指定(或默認)精度和比例所隱含的范圍時,MySQL 會存儲表示該范圍的相應(yīng)端點的值

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

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

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

如果啟用了嚴格的 SQL 模式,超出范圍會發(fā)生一個錯誤

mysql> SET sql_mode = 'TRADITIONAL'; -- 首先設(shè)置嚴格模式
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)嚴格模式被禁用,值可以插入,但會被裁剪,并且引發(fā)一個警告

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

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

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

數(shù)值表達式求值過程中的溢出會導(dǎo)致錯誤,例如,因為最大的有符號 BIGINT 值是 9223372036854775807,因此以下表達式會產(chǎn)生錯誤

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

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

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

整數(shù)數(shù)值之間的減去,如果其中一個類型為 UNSIGNED ,默認情況下會生成無符號結(jié)果。如果為負,則會引發(fā)錯誤

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é)果為負

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。但如果啟用了嚴格的 SQL 模式,則會發(fā)生錯誤并且列保持不變。

后記

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • mysql常用日期時間/數(shù)值函數(shù)詳解(必看)
  • MySQL整型數(shù)據(jù)溢出的解決方法
  • mysql unsigned 用法及相減出現(xiàn)補數(shù)溢出解決方法
  • 關(guān)于MySQL的整型數(shù)據(jù)的內(nèi)存溢出問題的應(yīng)對方法

標簽:白銀 湖南 烏海 湖北 臨汾 云浮 聊城 武威

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL數(shù)值類型溢出的處理方法》,本文關(guān)鍵詞  MySQL,數(shù)值,類型,溢出,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL數(shù)值類型溢出的處理方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL數(shù)值類型溢出的處理方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 1024手机看片国产旧版你懂的| 久久香蕉国产线看观看99| jzzijzzijzzij亚洲成熟少妇| 日韩美女免费线视频网址| 性生活视频在线播放| 撩起老师旗袍狠狠挺进视频| 精品国产一区二区三区日日嗨| 大胖子h粗污| 护士毛茸茸亚亚洲护士毛茸茸 | 国产凹凸熟女一区二区| 欧美俄罗斯乱妇| 国产日韩va欧美va在线观看| gay性视频| 秋霞A级毛片在线看| 123好逼| 3d动漫精品H区XXXXX区| 国产毛多水多高潮高清| 精品国产福利在线观看| GOGO人体做爰大胆裸体直播| 嗯啊痒| 七爷的小娇妻翻天了| 国产一级婬片A片久久久网站入口| 看污片的网站| 女同学棉袜调教vk| 亚洲 丝袜 另类 中文 成人| 无遮掩床上60分钟在线视频| 男女隐私下部视频| 717午夜伦电影理伦片| 欧美精品无码一区二区三区在线播放 | 被仇人调教成禁脔HHH虐| 美女女女女女女bbbbbb毛片| 亲爱的热爱的第二部| 我是学校的公厕谁都能上小作文| 欧美爽妇| 公交车两人双指探洞| 国产一国产看免费高清片| 日本综艺在哪些app里看| 国产精品视频久久| 91九色精品人成在线观看| 福利微拍一区二区| FREE嫩白18SEX性HD处|