欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、前言

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

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

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

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

兩臉懵逼!

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

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

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

要知其然,知其所以然。

二、實踐出真知

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;

我們新建一個表,里面有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;

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

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

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

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

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

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

3. 結(jié)論

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

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

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

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

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

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

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

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

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

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

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

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

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

相關文章

  • 一個單引號引發(fā)的MYSQL性能問題分析

    一個單引號引發(fā)的MYSQL性能問題分析

    剛剛我們說過了,生活中難免會有一些不如意,比如,我們用一個字符串類型的字段來作為主鍵,表面上,這太不如意了,然而,事實也證明這是有用的。
    2011-03-03
  • MySQL創(chuàng)建索引/判斷索引是否生效的問題

    MySQL創(chuàng)建索引/判斷索引是否生效的問題

    這篇文章主要介紹了MySQL創(chuàng)建索引/判斷索引是否生效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL筆記之視圖的使用詳解

    MySQL筆記之視圖的使用詳解

    使用視圖的大部分情況是為了保障數(shù)據(jù)安全性,提高查詢效率
    2013-05-05
  • MySQL教程數(shù)據(jù)定義語言DDL示例詳解

    MySQL教程數(shù)據(jù)定義語言DDL示例詳解

    這篇文章主要為大家介紹了MySQL教程中什么是數(shù)據(jù)定義語言DDL的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • mysql跨服務查詢之FEDERATED存儲引擎的實現(xiàn)

    mysql跨服務查詢之FEDERATED存儲引擎的實現(xiàn)

    本文主要介紹了mysql跨服務查詢之FEDERATED存儲引擎的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Mysql如何避免全表掃描的方法

    Mysql如何避免全表掃描的方法

    如果MySQL需要做一次全表掃描來處理查詢時,在 EXPLAIN 的結(jié)果中 type 字段的值是 ALL。
    2008-10-10
  • MySQL數(shù)據(jù)庫三種常用存儲引擎特性對比

    MySQL數(shù)據(jù)庫三種常用存儲引擎特性對比

    MySQL中的數(shù)據(jù)用各種不同的技術存儲在文件(或內(nèi)存)中,這些技術中的每一種技術都使用不同的存儲機制,索引技巧,鎖定水平并且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術及配套的相關功能稱為存儲引擎。
    2016-01-01
  • MySQL的的數(shù)據(jù)一致性保障與延遲問題處理

    MySQL的的數(shù)據(jù)一致性保障與延遲問題處理

    在分布式數(shù)據(jù)庫和高并發(fā)應用場景下,數(shù)據(jù)一致性 和 數(shù)據(jù)延遲 是兩個不可忽視的問題,MySQL 作為廣泛使用的關系型數(shù)據(jù)庫,提供了多種機制來保障數(shù)據(jù)一致性,本文將深入探討 MySQL 如何保障數(shù)據(jù)一致性 以及 應對數(shù)據(jù)延遲的策略,需要的朋友可以參考下
    2025-03-03
  • DQL數(shù)據(jù)查詢語句使用示例

    DQL數(shù)據(jù)查詢語句使用示例

    DQL(Data?Query?Language?數(shù)據(jù)查詢語言):用于查詢數(shù)據(jù)庫對象中所包含的數(shù)據(jù)。DQL語言主要的語句:SELECT語句。DQL語言是數(shù)據(jù)庫語言中最核心、最重要的語句,也是使用頻率最高的語句
    2022-12-12
  • MySQL中count()和count(1)有何區(qū)別以及哪個性能最好詳解

    MySQL中count()和count(1)有何區(qū)別以及哪個性能最好詳解

    count是一個函數(shù),用來統(tǒng)計數(shù)據(jù),但是count函數(shù)傳入的參數(shù)有很多種,比如count(1)、count(*)、count(字段)等,下面這篇文章主要給大家介紹了關于MySQL中count()和count(1)有何區(qū)別以及哪個性能最好的相關資料,需要的朋友可以參考下
    2022-08-08

最新評論