最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年08月28日 08:26:07   作者:一入碼坑深似海  
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)值類型溢出的處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

來,考考大家一個(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'
);

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

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

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

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ǔ)
    • 當(dāng)超出范圍的值分配給整數(shù)列時(shí),MySQL 會(huì)存儲(chǔ)表示列數(shù)據(jù)類型范圍的相應(yīng)端點(diǎn)的值
    • 當(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等語句會(huì)由于裁剪而發(fā)生的列分配轉(zhuǎn)換并且引發(fā)一個(gè)警告。

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

數(shù)值表達(dá)式求值過程中的溢出會(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 |
+-------------------------------------------+

從另一方面說,是否發(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ì)生成無符號(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)…

總結(jié)

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

相關(guān)文章

  • mysql把主鍵定義為自動(dòng)增長標(biāo)識(shí)符類型

    mysql把主鍵定義為自動(dòng)增長標(biāo)識(shí)符類型

    這篇文章主要介紹了mysql中如何把主鍵定義為自動(dòng)增長標(biāo)識(shí)符類型,下面有個(gè)不錯(cuò)的示例,大家可以參考下
    2014-07-07
  • 使用存儲(chǔ)過程實(shí)現(xiàn)循環(huán)插入100條記錄

    使用存儲(chǔ)過程實(shí)現(xiàn)循環(huán)插入100條記錄

    本節(jié)主要介紹了使用存儲(chǔ)過程實(shí)現(xiàn)循環(huán)插入100條記錄的具體實(shí)現(xiàn),需要的朋友可以參考下
    2014-07-07
  • Windows7下Python3.4使用MySQL數(shù)據(jù)庫

    Windows7下Python3.4使用MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了Windows7下Python3.4使用MySQL數(shù)據(jù)庫,MySQL Community Server的安裝步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • MySQL中的常用樹形結(jié)構(gòu)設(shè)計(jì)總結(jié)

    MySQL中的常用樹形結(jié)構(gòu)設(shè)計(jì)總結(jié)

    這篇文章主要介紹了MySQL中的常用樹形結(jié)構(gòu)設(shè)計(jì)總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MySQL實(shí)戰(zhàn)教程之Join語句執(zhí)行流程

    MySQL實(shí)戰(zhàn)教程之Join語句執(zhí)行流程

    這篇文章主要介紹了MySQL Join語句執(zhí)行流程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • MySQL字符集不一致導(dǎo)致索引失效的解決辦法

    MySQL字符集不一致導(dǎo)致索引失效的解決辦法

    本文分析了一個(gè)由于字符集不一致,導(dǎo)致增加了索引但是無法使用的案例,通過索引進(jìn)行查找時(shí)需要進(jìn)行數(shù)據(jù)的比較,字符集不一致時(shí)需要使用 convert 函數(shù)進(jìn)行轉(zhuǎn)換,從而導(dǎo)致索引失效,文中有詳細(xì)的解決辦法,需要的朋友可以參考下
    2024-04-04
  • MySQL常見優(yōu)化方案匯總

    MySQL常見優(yōu)化方案匯總

    mysql數(shù)據(jù)庫是中小微企業(yè)常用的一種數(shù)據(jù)化管理工具,它具有輕便,簡潔,免費(fèi)等特點(diǎn)。今天通過本文給大家介紹MySQL常見優(yōu)化方案匯總,感興趣的朋友一起看看吧
    2022-01-01
  • MySQL 使用自定義變量進(jìn)行查詢優(yōu)化

    MySQL 使用自定義變量進(jìn)行查詢優(yōu)化

    MySQL自定義變量估計(jì)很少人有用到,但是如果用好了也是可以輔助進(jìn)行性能優(yōu)化的。需要注意的是變量是基于連接會(huì)話的,而且可能存在一些意外的情況,需要小心使用。本篇介紹如何利用自定義變量進(jìn)行查詢優(yōu)化,提高效率
    2021-05-05
  • mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢

    mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢

    這篇文章介紹了mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • MySQL數(shù)據(jù)庫JDBC編程詳解流程

    MySQL數(shù)據(jù)庫JDBC編程詳解流程

    JDBC是指Java數(shù)據(jù)庫連接,是一種標(biāo)準(zhǔn)Java應(yīng)用編程接口(?JAVA?API),用來連接?Java?編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,本篇文章我們來了解MySQL連接JDBC的流程方法
    2022-01-01

最新評(píng)論

随州市| 正宁县| 九江县| 基隆市| 巴南区| 天水市| 苏州市| 孟州市| 湄潭县| 建水县| 米脂县| 汉寿县| 秦皇岛市| 永川市| 大田县| 安图县| 许昌市| 务川| 双流县| 会昌县| 和田市| 瑞金市| 白银市| 荥阳市| 光泽县| 罗甸县| 淮阳县| 慈溪市| 常德市| 清涧县| 东丽区| 东乡县| 县级市| 西城区| 肇源县| 上高县| 天全县| 永昌县| 大港区| 峨山| 枣强县|