婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解析MySQL隱式轉(zhuǎn)換問題

解析MySQL隱式轉(zhuǎn)換問題

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

一、問題描述

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)

奇怪的現(xiàn)象:

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也出來了

二、源碼解釋

堆棧調(diào)用關系如下所示:

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

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轉(zhuǎn)成doule的值為2.0402702611292762e17,等式成立,判定為符合條件的行,繼續(xù)往下掃描,同理204027026112927603也同樣符合

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

MySQL string轉(zhuǎn)成double的定義函數(shù)如下:

{
 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);
}

真正轉(zhuǎn)換函數(shù)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)

三、結論

避免發(fā)生隱式類型轉(zhuǎn)換,隱式轉(zhuǎn)換的類型主要有字段類型不一致、in參數(shù)包含多個類型、字符集類型或校對規(guī)則不一致等

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

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

最后貼一下官網(wǎng)對于隱式類型轉(zhuǎn)換的說明吧

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隱式轉(zhuǎn)換,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

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

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

巨人網(wǎng)絡通訊聲明:本文標題《解析MySQL隱式轉(zhuǎn)換問題》,本文關鍵詞  解析,MySQL,隱式,轉(zhuǎn)換,問題,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解析MySQL隱式轉(zhuǎn)換問題》相關的同類信息!
  • 本頁收集關于解析MySQL隱式轉(zhuǎn)換問題的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    av成人免费在线| 久久狠狠亚洲综合| 国产精品美女视频| 国产精品的网站| 国产精品久久久久aaaa樱花| 国产精品―色哟哟| 中文字幕在线观看一区| 亚洲精品老司机| 亚洲aⅴ怡春院| 久久成人免费电影| 福利91精品一区二区三区| 欧美精品18+| 日韩免费观看高清完整版在线观看| 在线成人av网站| 久久蜜桃av一区精品变态类天堂| 国产欧美综合在线| 一区二区三区中文字幕电影| 日韩av高清在线观看| 国产一区二区电影| 欧美综合一区二区三区| 日韩欧美一区中文| 中文字幕在线不卡| 日韩在线一区二区三区| 国产福利不卡视频| 日本精品一区二区三区高清| 日韩欧美中文一区二区| 国产精品美女久久久久久久久久久| 1区2区3区欧美| 精品一区二区三区不卡| 色婷婷久久久亚洲一区二区三区 | 亚洲国产欧美在线| 美女视频一区二区三区| aa级大片欧美| 久久久精品2019中文字幕之3| 亚洲最大成人综合| 成人午夜视频免费看| 制服丝袜av成人在线看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产资源在线一区| 色婷婷综合久久久久中文一区二区| 91精品国产色综合久久不卡电影| 中文字幕日韩精品一区| 韩国中文字幕2020精品| 欧美亚洲动漫另类| 综合欧美亚洲日本| 国产成人午夜99999| 日韩区在线观看| 天堂久久一区二区三区| 97精品国产露脸对白| 久久久久久久久蜜桃| 蜜臀av一级做a爰片久久| 欧美网站一区二区| 亚洲六月丁香色婷婷综合久久 | 激情久久五月天| 欧美日韩亚洲综合一区| 一区二区三区在线视频免费| 不卡电影免费在线播放一区| 久久久亚洲精华液精华液精华液| 亚洲成a人片在线不卡一二三区 | 日本国产一区二区| 中文字幕在线一区二区三区| 国产精品亚洲午夜一区二区三区| 欧美日韩免费观看一区三区| 亚洲青青青在线视频| 成人动漫视频在线| 国产精品国产三级国产a| 国产成人免费av在线| 久久免费午夜影院| 国产99精品在线观看| 久久久五月婷婷| 从欧美一区二区三区| 中文字幕欧美日本乱码一线二线| 精品一区二区三区免费毛片爱| 日韩亚洲欧美在线观看| 久久精品国产成人一区二区三区 | 欧美色综合天天久久综合精品| 中文字幕一区二区三区蜜月 | 91福利在线观看| 一区二区三区国产精华| 欧美一区三区二区| 日韩av午夜在线观看| 欧美亚洲综合网| 亚洲主播在线播放| 欧美一区二区三区不卡| 免费观看91视频大全| 精品国产亚洲在线| 成人性生交大片免费看中文| 亚洲欧洲中文日韩久久av乱码| 色婷婷综合激情| 天天av天天翘天天综合网| 日韩视频一区二区三区| 国产麻豆午夜三级精品| 亚洲美女在线国产| 日韩一二在线观看| 不卡视频在线观看| 亚洲成人你懂的| 2023国产精品自拍| 在线一区二区视频| 久久66热re国产| 亚洲激情av在线| 久久午夜电影网| 在线亚洲精品福利网址导航| 精品一区二区三区视频| 亚洲美女在线国产| 久久精品在线免费观看| 欧美在线综合视频| 国产精品一二三四| 亚洲动漫第一页| 国产精品久久久久久久久快鸭 | 日韩精品成人一区二区三区 | 欧美图区在线视频| 国产精品一二三| 亚洲第一在线综合网站| 中文天堂在线一区| 制服丝袜一区二区三区| 97se亚洲国产综合自在线不卡| 日本成人在线电影网| 一区二区三区欧美激情| 久久精品人人做人人综合| 色国产精品一区在线观看| 国产成+人+日韩+欧美+亚洲| 丝袜美腿亚洲色图| 一区二区成人在线| 中文字幕不卡在线| 国产亚洲精品aa| 精品国产一区二区精华| 欧美精品一级二级| 色偷偷久久人人79超碰人人澡| 国产高清亚洲一区| 国产最新精品精品你懂的| 亚洲国产精品视频| 亚洲欧美福利一区二区| 国产精品理伦片| 国产精品久久久久久久第一福利| 欧美第一区第二区| 欧美岛国在线观看| 精品国产制服丝袜高跟| 欧美一级黄色大片| 欧美一区二区三区人| 宅男在线国产精品| 日韩小视频在线观看专区| 欧美放荡的少妇| 91精品久久久久久蜜臀| 日韩一卡二卡三卡四卡| 欧美一级日韩不卡播放免费| 日韩欧美一二三区| 精品电影一区二区三区| 欧美一区二区三区人| 精品乱人伦一区二区三区| 精品国产乱码久久久久久老虎| 欧美电视剧在线看免费| 国产校园另类小说区| 国产精品视频一区二区三区不卡| 国产免费成人在线视频| 国产欧美日韩不卡免费| 亚洲三级在线播放| 亚洲成人www| 精品一区二区三区视频在线观看| 激情综合亚洲精品| 成人性生交大片免费| 91色乱码一区二区三区| 欧美唯美清纯偷拍| 欧美一区二区三区爱爱| 久久久久国产成人精品亚洲午夜| 国产三级欧美三级日产三级99| 欧美国产日韩一二三区| 一区二区三区欧美激情| 免费在线观看一区二区三区| 国产精品影视网| 欧美性一二三区| 久久久蜜臀国产一区二区| 国产精品国产精品国产专区不片| 亚洲精品成人悠悠色影视| 婷婷夜色潮精品综合在线| 蜜桃av一区二区三区| 成人av免费在线| 欧美一区二区三区人| 国产女人aaa级久久久级 | 色婷婷国产精品| 日韩一区二区精品葵司在线| 国产精品亲子乱子伦xxxx裸| 亚洲亚洲人成综合网络| 国产在线精品一区在线观看麻豆| 99精品视频在线播放观看| 日韩欧美一区中文| 亚洲永久免费av| 成人av在线播放网址| 日韩一区二区三区精品视频| 亚洲欧美激情插 | 一区二区三区四区中文字幕| 久久99精品国产麻豆婷婷洗澡| 97久久久精品综合88久久| 日韩欧美激情四射| 亚洲国产色一区| av在线不卡观看免费观看| 精品久久久久久久人人人人传媒| 有码一区二区三区| 99re热视频这里只精品| 国产丝袜欧美中文另类| 老司机精品视频一区二区三区|