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

詳解MySQL中varchar和int隱式轉(zhuǎn)換的注意事項(xiàng)

 更新時(shí)間:2023年12月26日 16:19:22   作者:掉發(fā)的小王  
這篇文章主要為大家詳細(xì)介紹了MySQL中varchar和int隱式轉(zhuǎn)換的注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、前言

在一個(gè)陽光明媚的下午,我們的測試在運(yùn)行SQL是發(fā)現(xiàn)了一個(gè)靈異事件。

別著急,等我慢慢說來,是一個(gè)查詢庫存的SQL,控制臺打印了,查詢?yōu)?條記錄。

想著不太信,自己把SQL粘出來執(zhí)行一下,剛好有個(gè)varchar類型的字段,查詢的是一堆數(shù)字,忘記加引號了。

結(jié)果查詢出來了一條!

兩臉懵逼!

從頭看到結(jié)尾,發(fā)現(xiàn)我們查詢條件的字段值為231120103,把數(shù)據(jù)庫中231120103-1的查詢出來了!

經(jīng)過半天的探索,發(fā)現(xiàn)這是MySQL優(yōu)化器中,判斷數(shù)據(jù)類型不匹配的比較時(shí),MySQL 優(yōu)化器會(huì)進(jìn)行隱式類型轉(zhuǎn)換!

下面我們一起來看看這個(gè)隱式轉(zhuǎn)換,到底是怎么轉(zhuǎn)換的!

要知其然,知其所以然。

二、實(shí)踐出真知

1. 建表

CREATE TABLE `str_test`  (
  `id` int(0) NOT NULL,
  `str_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `int_column` int(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

我們新建一個(gè)表,里面有varchar和int類型,插入幾條方便測試!

INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (1, '123', 123);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (2, '123-1---1122', 12);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (3, 'abc', 1);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (4, '783221667772672728', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (5, '783221667772672798', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (6, '0', 0);

2. 測試查詢

我們先以int類型查詢varchar作為測試:

SELECT * FROM `str_test` WHERE str_column = 123;

大家是不是認(rèn)為這里只能查詢出一條數(shù)據(jù),答案是錯(cuò)誤的!我們后面統(tǒng)一說結(jié)論,這里先看測試!

我們在插入一條str_column位數(shù)超過18位的!讓轉(zhuǎn)化是丟失精度,從而實(shí)現(xiàn)多查的情況!

我們看到查詢的和被查詢出來的是不一樣的!

我們在以varchar來查詢int字段:

SELECT * FROM `str_test` WHERE int_column = '12A333';

還是可以查詢到數(shù)據(jù)!

3. 結(jié)論

經(jīng)過上面的測試是不是已經(jīng)汗流浹背了!不要慌,下面我們來揭曉答案!

有興趣的可以看看官網(wǎng)文檔:MySQL5.7文檔

當(dāng)整數(shù)與字符串進(jìn)行比較時(shí),無論數(shù)據(jù)庫是int還是varchar,只要類型不一致時(shí),MySQL會(huì)嘗試將字符串轉(zhuǎn)換為整數(shù)進(jìn)行比較。

如果字符串以有效的數(shù)字開頭,則將其轉(zhuǎn)換為相應(yīng)的整數(shù)值。

解析規(guī)則:從開頭解析直到遇到非數(shù)字的字符結(jié)束,前面的會(huì)作為比較的值,非數(shù)字后面的直接拋棄。

如果字符串以非數(shù)字字符開頭,將被轉(zhuǎn)化為0。

數(shù)值過大時(shí),回傳精度損失,也會(huì)出現(xiàn)匹配。沒找到具體的臨界值,超過18位會(huì)出現(xiàn)浮點(diǎn)數(shù)精度損失!

三、隱式轉(zhuǎn)換的缺點(diǎn)

精度損失: 隱式轉(zhuǎn)換可能導(dǎo)致精度損失問題,上面我們演示過了。

性能開銷: 在進(jìn)行大規(guī)模數(shù)據(jù)處理時(shí),頻繁的隱式轉(zhuǎn)換可能會(huì)對性能產(chǎn)生影響。

索引失效:存在隱式轉(zhuǎn)換會(huì)讓優(yōu)化器無法使用索引進(jìn)行優(yōu)化查詢,影響響應(yīng)時(shí)間。

數(shù)據(jù)安全風(fēng)險(xiǎn):如果是一個(gè)刪除語句,像上面演示的會(huì)出現(xiàn)匹配到其他行,從而導(dǎo)致數(shù)據(jù)被誤刪。還有多查的問題。

到此這篇關(guān)于詳解MySQL中varchar和int隱式轉(zhuǎn)換的注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL隱式轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL進(jìn)行數(shù)據(jù)庫審計(jì)的詳細(xì)步驟和示例代碼

    MySQL進(jìn)行數(shù)據(jù)庫審計(jì)的詳細(xì)步驟和示例代碼

    數(shù)據(jù)庫審計(jì)通過觸發(fā)器、內(nèi)置功能及第三方工具記錄和監(jiān)控?cái)?shù)據(jù)庫活動(dòng),確保安全、完整與合規(guī),Java代碼實(shí)現(xiàn)自動(dòng)化日志記錄,整合分析系統(tǒng)提升監(jiān)控效率,本文給大家介紹MySQL進(jìn)行數(shù)據(jù)庫審計(jì)的詳細(xì)步驟和示例代碼,感興趣的朋友一起看看吧
    2025-07-07
  • MySQL用戶授權(quán)管理及白名單的實(shí)現(xiàn)

    MySQL用戶授權(quán)管理及白名單的實(shí)現(xiàn)

    MySQL作為一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在權(quán)限管理和用戶認(rèn)證方面提供了豐富的功能和方案,本文主要介紹了MySQL用戶授權(quán)管理及白名單的實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • MySQL修改密碼的四種方式詳解

    MySQL修改密碼的四種方式詳解

    文章介紹了4種修改MySQL密碼的方法,包括使用setpassword命令、mysqladmin命令、修改user表以及忘記密碼時(shí)的處理步驟,感興趣的朋友一起看看吧
    2025-03-03
  • mysql中的int(5)到底有是多長

    mysql中的int(5)到底有是多長

    這篇文章主要介紹了mysql中的int(5)到底有是多長,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL 自定義變量的概念及特點(diǎn)

    MySQL 自定義變量的概念及特點(diǎn)

    MySQL 是可以自定義臨時(shí)變量的,而臨時(shí)變量在做查詢優(yōu)化和靜態(tài)查詢分析時(shí)十分有用。而實(shí)際上很少有人記得 MySQL 的自定義變量。本篇文章講述 MySQL 的自定義變量的概念及特點(diǎn)。
    2021-05-05
  • MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟

    MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟

    在構(gòu)建Web應(yīng)用程序時(shí),MySQL是存儲(chǔ)數(shù)據(jù)的核心工具,在云服務(wù)器上,正確設(shè)置MySQL的存儲(chǔ)路徑對應(yīng)用性能至關(guān)重要,通過遷移,我們不僅解決了空間不足的問題,還能讓數(shù)據(jù)庫運(yùn)行得更快,所以本文將給大家介紹MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟,需要的朋友可以參考下
    2024-06-06
  • mysql之如何把查詢的結(jié)果保存到新表

    mysql之如何把查詢的結(jié)果保存到新表

    這篇文章主要介紹了mysql之如何把查詢的結(jié)果保存到新表問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql數(shù)據(jù)庫中1045錯(cuò)誤的解決方法

    mysql數(shù)據(jù)庫中1045錯(cuò)誤的解決方法

    這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)庫中1045錯(cuò)誤的解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • mysql中 char 和 varchar 的區(qū)別解析

    mysql中 char 和 varchar 的區(qū)別解析

    本文詳細(xì)解釋了MySQL中CHAR和VARCHAR兩種字符串?dāng)?shù)據(jù)類型的區(qū)別,包括長度處理、存儲(chǔ)方式、尾部空格處理和性能考量,并給出了選擇建議,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-11-11
  • mysql5.7.14 解壓版安裝配置方法圖文教程(win10)

    mysql5.7.14 解壓版安裝配置方法圖文教程(win10)

    這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.14 winx64安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

石嘴山市| 潜江市| 南川市| 江口县| 江口县| 龙游县| 榆社县| 舞阳县| 惠水县| 金平| 华蓥市| 乐安县| 克山县| 平江县| 阿克苏市| 吉安县| 岑巩县| 仁寿县| 赤峰市| 祁阳县| 玉龙| 宜兰市| 东辽县| 荣成市| 沙坪坝区| 中超| 贡嘎县| 吴旗县| 郧西县| 临泉县| 班戈县| 大丰市| 神池县| 定安县| 曲阳县| 化州市| 汪清县| 拉萨市| 叙永县| 博客| 桂阳县|