欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 解析MySQL隱式轉換問題

解析MySQL隱式轉換問題

熱門標簽:銷售語音電話機器人 常州網絡外呼系統開發 萊西市地圖標注 安徽ai電話電銷機器人有效果嗎 在哪里申請400電話 400電話申請信用卡 巫師三血與酒地圖標注 走過哪個省地圖標注 外呼系統電銷受騙

一、問題描述

root@mysqldb 22:12: [xucl]> show create table t1\G
*************************** 1. row ***************************
 Table: t1
Create Table: CREATE TABLE `t1` (
 `id` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
 
root@mysqldb 22:19: [xucl]> select * from t1;
+--------------------+
| id   |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
| 2040270261129276 |
| 2040270261129275 |
| 100  |
| 101  |
+--------------------+
6 rows in set (0.00 sec)

奇怪的現象:

root@mysqldb 22:19: [xucl]> select * from t1 where id=204027026112927603;
+--------------------+
| id   |
+--------------------+
| 204027026112927605 |
| 204027026112927603 |
+--------------------+
2 rows in set (0.00 sec)
640?wx_fmt=jpeg

什么鬼,明明查的是204027026112927603,為什么204027026112927605也出來了

二、源碼解釋

堆棧調用關系如下所示:

其中JOIN::exec()是執行的入口,Arg_comparator::compare_real()是進行等值判斷的函數,其定義如下

int Arg_comparator::compare_real()
{
 /*
 Fix yet another manifestation of Bug#2338. 'Volatile' will instruct
 gcc to flush double values out of 80-bit Intel FPU registers before
 performing the comparison.
 */
 volatile double val1, val2;
 val1= (*a)->val_real();
 if (!(*a)->null_value)
 {
 val2= (*b)->val_real();
 if (!(*b)->null_value)
 {
 if (set_null)
 owner->null_value= 0;
 if (val1  val2) return -1;
 if (val1 == val2) return 0;
 return 1;
 }
 }
 if (set_null)
 owner->null_value= 1;
 return -1;
}

比較步驟如下圖所示,逐行讀取t1表的id列放入val1,而常量204027026112927603存在于cache中,類型為double類型(2.0402702611292762E+17),所以到這里傳值給val2后val2=2.0402702611292762E+17。

當掃描到第一行時,204027026112927605轉成doule的值為2.0402702611292762e17,等式成立,判定為符合條件的行,繼續往下掃描,同理204027026112927603也同樣符合

如何檢測string類型的數字轉成doule類型是否溢出呢?這里經過測試,當數字超過16位以后,轉成double類型就已經不準確了,例如20402702611292711會表示成20402702611292712(如圖中val1)

MySQL string轉成double的定義函數如下:

{
 char buf[DTOA_BUFF_SIZE];
 double res;
 DBUG_ASSERT(end != NULL  ((str != NULL  *end != NULL) ||
    (str == NULL  *end == NULL)) 
  error != NULL);

 res= my_strtod_int(str, end, error, buf, sizeof(buf));
 return (*error == 0) ? res : (res  0 ? -DBL_MAX : DBL_MAX);
}

真正轉換函數my_strtod_int位置在dtoa.c(太復雜了,簡單貼個注釋吧)

/*
 strtod for IEEE--arithmetic machines.
 
 This strtod returns a nearest machine number to the input decimal
 string (or sets errno to EOVERFLOW). Ties are broken by the IEEE round-even
 rule.
 
 Inspired loosely by William D. Clinger's paper "How to Read Floating
 Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
 
 Modifications:
 
 1. We only require IEEE (not IEEE double-extended).
 2. We get by with floating-point arithmetic in a case that
 Clinger missed -- when we're computing d * 10^n
 for a small integer d and the integer n is not too
 much larger than 22 (the maximum integer k for which
 we can represent 10^k exactly), we may be able to
 compute (d*10^k) * 10^(e-k) with just one roundoff.
 3. Rather than a bit-at-a-time adjustment of the binary
 result in the hard case, we use floating-point
 arithmetic to determine the adjustment to within
 one bit; only in really hard cases do we need to
 compute a second residual.
 4. Because of 3., we don't need a large table of powers of 10
 for ten-to-e (just some small tables, e.g. of 10^k
 for 0 = k = 22).
*/

既然是這樣,我們測試下沒有溢出的案例

root@mysqldb 23:30: [xucl]> select * from t1 where id=2040270261129276;
+------------------+
| id  |
+------------------+
| 2040270261129276 |
+------------------+
1 row in set (0.00 sec)
 
root@mysqldb 23:30: [xucl]> select * from t1 where id=101;
+------+
| id |
+------+
| 101 |
+------+
1 row in set (0.00 sec)

結果符合預期,而在本例中,正確的寫法應當是

root@mysqldb 22:19: [xucl]> select * from t1 where id='204027026112927603';
+--------------------+
| id   |
+--------------------+
| 204027026112927603 |
+--------------------+
1 row in set (0.01 sec)

三、結論

避免發生隱式類型轉換,隱式轉換的類型主要有字段類型不一致、in參數包含多個類型、字符集類型或校對規則不一致等

隱式類型轉換可能導致無法使用索引、查詢結果不準確等,因此在使用時必須仔細甄別

數字類型的建議在字段定義時就定義為int或者bigint,表關聯時關聯字段必須保持類型、字符集、校對規則都一致

最后貼一下官網對于隱式類型轉換的說明吧

1、If one or both arguments are NULL, the result of the comparison is NULL, except for the NULL-safe
=> equality comparison operator. For NULL => NULL, the result is true. No conversion is needed.
2、If both arguments in a comparison operation are strings, they are compared as strings.
3、If both arguments are integers, they are compared as integers.
4、Hexadecimal values are treated as binary strings if not compared to a number.
5、If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a
constant, the constant is converted to a timestamp before the comparison is performed. This is
done to be more ODBC-friendly. This is not done for the arguments to IN(). To be safe, always
use complete datetime, date, or time strings when doing comparisons. For example, to achieve best
results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to
the desired data type.
A single-row subquery from a table or tables is not considered a constant. For example, if a subquery
returns an integer to be compared to a DATETIME value, the comparison is done as two integers.
The integer is not converted to a temporal value. To compare the operands as DATETIME values,
use CAST() to explicitly convert the subquery value to DATETIME.
6、If one of the arguments is a decimal value, comparison depends on the other argument. The
arguments are compared as decimal values if the other argument is a decimal or integer value, or as
floating-point values if the other argument is a floating-point value.
7、In all other cases, the arguments are compared as floating-point (real) numbers.

總結

以上所述是小編給大家介紹的MySQL隱式轉換,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • mysql查詢的時候給字段賦默認值操作
  • 詳解Mysql數據庫date, datetime類型設置0000-00-00默認值(default)報錯問題
  • MySQL5.7中的sql_mode默認值帶來的坑及解決方法
  • mysql中datetime類型設置默認值方法
  • MySQL命令行中給表添加一個字段(字段名、是否為空、默認值)
  • Mysql select語句設置默認值的方法
  • 解析MySQL設置當前時間為默認值的方法
  • MySQL表字段設置默認值(圖文教程及注意細節)
  • Mysql 5.6 "隱式轉換"導致的索引失效和數據不準確的問題
  • MySQL的隱式類型轉換整理總結
  • MySQL 如何處理隱式默認值

標簽:果洛 黃石 河北 陽江 煙臺 鞍山 來賓 赤峰

巨人網絡通訊聲明:本文標題《解析MySQL隱式轉換問題》,本文關鍵詞  解析,MySQL,隱式,轉換,問題,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解析MySQL隱式轉換問題》相關的同類信息!
  • 本頁收集關于解析MySQL隱式轉換問題的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产欧美日韩在线观看| 国产精品中文字幕欧美| 日本亚洲一区二区三区| 亚洲最大的黄色网址| 国产女人aaa级久久久级| 精品在线你懂的| 中国毛片在线观看| 欧美不卡激情三级在线观看| 三级影片在线观看欧美日韩一区二区| 熟妇女人妻丰满少妇中文字幕| 日本乱人伦aⅴ精品| 亚洲精品国产品国语在线app| a美女胸又www黄视频久久| 亚洲av无码一区二区三区在线| 国产精品水嫩水嫩| 丁香网亚洲国际| 四虎精品免费视频| ...xxx性欧美| 91免费视频观看| 欧美日韩三级视频| 午夜精品久久一牛影视| 亚洲最大免费视频| 欧美精品一区男女天堂| 国产在线精品免费| 最新黄色av网址| 成人欧美一区二区三区1314| 99久久精品一区二区| 欧美中文字幕不卡| 天天综合色天天综合| 色呦呦一区二区| 亚洲精品在线三区| 国产盗摄女厕一区二区三区 | 91在线无精精品入口| 在线免费观看日韩欧美| 亚洲综合久久久| 三级男人添奶爽爽爽视频| 日韩免费看的电影| 韩国一区二区三区| 18岁成人毛片| 亚洲电影第三页| 欧洲av一区二区三区| 中文字幕av在线一区二区三区| 99久久99精品久久久久久| 欧美日产国产精品| 蜜桃视频在线一区| 三级av在线免费观看| 亚洲综合一区二区三区| 在线免费观看成年人视频| 久久久国产综合精品女国产盗摄| 成人福利电影精品一区二区在线观看| 欧美天堂一区二区三区| 免费人成网站在线观看欧美高清| 精品人体无码一区二区三区| 亚洲欧美一区二区久久| 免费看黄色aaaaaa 片| 欧美激情资源网| youjizz.com日本| 久久久不卡影院| 在线观看免费看片| 久久久美女毛片| 91猫先生在线| 久久夜色精品国产噜噜av| aa级大片欧美| 精品久久久三级丝袜| 成人av资源下载| 日韩欧美123| 成人av网站在线观看| 欧美一级黄色片| jiyouzz国产精品久久| 精品久久久久久久一区二区蜜臀| 成人ar影院免费观看视频| 日韩一区二区三区精品视频| 成人免费看的视频| 欧美成人三级在线| 91麻豆自制传媒国产之光| 久久久久久久久久久久电影| 国产精品一区二区在线免费观看| 国产婷婷色一区二区三区四区| 欧美日韩一区二区区| 国产三级精品三级在线专区| 亚洲视频天天射| 国产精品毛片久久久久久| 亚洲欧美在线不卡| 一区二区在线看| 人妻无码一区二区三区免费| 亚洲大片免费看| 神马久久精品综合| 老司机精品视频在线| 欧美日韩在线免费视频| 激情久久五月天| 欧美精品色一区二区三区| 成人午夜视频免费看| 精品盗摄一区二区三区| 激情综合激情五月| 亚洲欧美另类图片小说| 亚洲精品电影院| 久久99久久久久久久久久久| 欧美日韩激情一区二区| 波多野结衣精品在线| 国产欧美在线观看一区| 在线观看日韩精品视频| 亚洲国产精品久久久男人的天堂| 国产盗摄一区二区三区在线| 国产呦萝稀缺另类资源| 精品入口麻豆88视频| 欧洲熟妇的性久久久久久| 亚洲乱码日产精品bd| 免费在线观看a级片| 国产美女一区二区三区| 欧美不卡视频一区| 亚洲午夜福利在线观看| 天堂影院一区二区| 欧美日韩激情一区| 国产男女无遮挡猛进猛出| 日韩美女啊v在线免费观看| 国产精品精品软件男同| 国模大尺度一区二区三区| 精品国精品国产| 玖草视频在线观看| 日本女优在线视频一区二区| 欧美狂野另类xxxxoooo| 一级黄色电影片| 疯狂撞击丝袜人妻| 国产裸体歌舞团一区二区| 26uuu亚洲综合色欧美| 永久免费成人代码| 久久se精品一区精品二区| 精品人妻少妇嫩草av无码| 性久久久久久久| 欧美日韩免费观看一区三区| av网站免费线看精品| 国产精品三级电影| 日韩精品一区二区亚洲av性色| 国产精品一区二区果冻传媒| 欧美经典一区二区| 多男操一女视频| 高清av一区二区| 日韩一区在线播放| 日韩成人黄色片| 欧美色图校园春色| 亚洲高清免费视频| 日韩一区二区三区在线观看| 瑟瑟视频在线观看| 久色婷婷小香蕉久久| 久久久久久综合| 黄色录像免费观看| 99在线精品一区二区三区| 亚洲精品成人少妇| 在线成人免费观看| 中文字幕第4页| 国产精品一二三四| 国产精品久久久久7777按摩| 色呦呦国产精品| 美女露出粉嫩尿囗让男人桶| 日韩高清国产一区在线| 久久综合色天天久久综合图片| 老司机精品免费视频| caoporn国产精品| 亚洲chinese男男1069| 精品国产制服丝袜高跟| 特黄一区二区三区| 国产精品熟女一区二区不卡| 午夜视频在线观看一区二区| 精品国产精品网麻豆系列| 人人澡人人澡人人看| 四虎国产精品免费| 蜜臀精品久久久久久蜜臀| 欧美国产精品久久| 欧美图片一区二区三区| 91中文字幕永久在线| 成人深夜福利app| 亚洲成人一二三| 久久久久久久久岛国免费| 色综合久久天天| 中文字幕在线播放一区| 国产精品18久久久久久vr| 一区二区三区在线观看视频| 日韩午夜在线观看视频| 91传媒免费观看| 美女又爽又黄免费| 成人在线视频一区| 婷婷国产在线综合| 国产精品人成在线观看免费| 欧美人与性动xxxx| ass极品国模人体欣赏| 人妻换人妻仑乱| 狠狠色狠狠色合久久伊人| 在线观看黄网址| 中文字幕99页| 国产成人精品免费看| 午夜视频在线观看一区| 国产日韩欧美综合一区| 欧美理论在线播放| 在线观看黄网址| 久久亚洲AV成人无码国产野外| 成人的网站免费观看| 蜜臂av日日欢夜夜爽一区| 亚洲婷婷在线视频| 亚洲精品在线免费播放| 欧美日韩另类一区|