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

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

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

熱門標(biāo)簽:銷售語音電話機(jī)器人 常州網(wǎng)絡(luò)外呼系統(tǒng)開發(fā) 萊西市地圖標(biāo)注 安徽ai電話電銷機(jī)器人有效果嗎 在哪里申請400電話 400電話申請信用卡 巫師三血與酒地圖標(biāo)注 走過哪個(gè)省地圖標(biāo)注 外呼系統(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)用關(guān)系如下所示:

其中JOIN::exec()是執(zhí)行的入口,Arg_comparator::compare_real()是進(jìn)行等值判斷的函數(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。

當(dāng)掃描到第一行時(shí),204027026112927605轉(zhuǎn)成doule的值為2.0402702611292762e17,等式成立,判定為符合條件的行,繼續(xù)往下掃描,同理204027026112927603也同樣符合

如何檢測string類型的數(shù)字轉(zhuǎn)成doule類型是否溢出呢?這里經(jīng)過測試,當(dāng)數(shù)字超過16位以后,轉(zhuǎn)成double類型就已經(jīng)不準(zhǔn)確了,例如20402702611292711會(huì)表示成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(太復(fù)雜了,簡單貼個(gè)注釋吧)

/*
 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)

結(jié)果符合預(yù)期,而在本例中,正確的寫法應(yīng)當(dāng)是

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

三、結(jié)論

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

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

數(shù)字類型的建議在字段定義時(shí)就定義為int或者bigint,表關(guān)聯(lián)時(shí)關(guā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.

總結(jié)

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

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

標(biāo)簽:果洛 黃石 河北 陽江 煙臺 鞍山 來賓 赤峰

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解析MySQL隱式轉(zhuǎn)換問題》,本文關(guān)鍵詞  解析,MySQL,隱式,轉(zhuǎn)換,問題,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解析MySQL隱式轉(zhuǎn)換問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于解析MySQL隱式轉(zhuǎn)換問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美伊人久久大香线蕉综合69| 国产日本欧美一区二区| 成人动漫一区二区| 欧美视频一区二区三区四区 | 国产综合久久久久久久久久久久| a在线播放不卡| 欧美电视剧免费全集观看| 久久久综合精品| 麻豆久久久久久| av亚洲产国偷v产偷v自拍| 日韩欧美国产精品| 一区二区三区日韩精品| 成人av电影在线播放| 久久久久久夜精品精品免费| 美美哒免费高清在线观看视频一区二区| 国产精品热久久久久夜色精品三区 | 成人18精品视频| www国产亚洲精品久久麻豆| 天堂av在线一区| 欧美视频在线一区二区三区| 国产欧美日韩亚州综合| 精品中文字幕一区二区小辣椒| 2024国产精品| 色综合一区二区三区| 丝袜美腿亚洲一区二区图片| 亚洲精品一区二区三区四区高清| 国产剧情一区二区三区| 国产三级精品视频| 欧美视频一区在线观看| 国产suv精品一区二区6| 一区av在线播放| 久久久三级国产网站| 欧美午夜片在线观看| 国产suv精品一区二区883| 日本aⅴ亚洲精品中文乱码| 中文字幕+乱码+中文字幕一区| 欧美综合色免费| 粉嫩在线一区二区三区视频| 日本va欧美va欧美va精品| 国产精品久久久爽爽爽麻豆色哟哟| 欧美精品久久99| 99国产麻豆精品| 国产精品一区二区三区四区| 亚洲sss视频在线视频| 国产精品白丝在线| www久久久久| 精品sm在线观看| 日韩欧美亚洲一区二区| 欧美精品自拍偷拍| 欧美视频在线一区二区三区 | 精品第一国产综合精品aⅴ| 91黄色小视频| 91色乱码一区二区三区| 成人综合婷婷国产精品久久| 免费成人你懂的| 免费高清在线一区| 日韩一区欧美二区| 日产国产欧美视频一区精品| 亚洲一区二区av在线| 亚洲视频在线一区| 亚洲婷婷综合色高清在线| 国产精品久久久久影院老司| 国产精品三级av在线播放| 国产色爱av资源综合区| 国产性做久久久久久| 国产欧美一区二区精品忘忧草| 精品成人私密视频| 久久久久国产一区二区三区四区 | 精品日本一线二线三线不卡| 日韩亚洲电影在线| 日韩视频永久免费| 欧美va天堂va视频va在线| 在线播放一区二区三区| 欧美一卡2卡3卡4卡| 欧美电视剧免费观看| 国产午夜亚洲精品羞羞网站| 国产嫩草影院久久久久| 亚洲老妇xxxxxx| 婷婷综合久久一区二区三区| 人人狠狠综合久久亚洲| 精品无人码麻豆乱码1区2区| 国产福利一区在线| 成人黄页毛片网站| 在线观看精品一区| 欧美一区二区三区免费大片| 欧美va天堂va视频va在线| 国产日本亚洲高清| 亚洲三级理论片| 日日摸夜夜添夜夜添精品视频| 久久精品噜噜噜成人88aⅴ| 国产乱码精品一区二区三| av在线综合网| 91精品国产日韩91久久久久久| 久久天堂av综合合色蜜桃网| 亚洲欧洲三级电影| 五月综合激情日本mⅴ| 国产精品一线二线三线| 日本电影亚洲天堂一区| 欧美mv日韩mv国产网站app| 亚洲天堂中文字幕| 免费欧美高清视频| 99久久国产综合精品麻豆| 欧美一区二区私人影院日本| 国产欧美一区二区精品久导航 | 日韩精品欧美精品| 国产精品资源网| 欧美性极品少妇| 国产精品欧美精品| 蜜臀av国产精品久久久久| 成人app网站| 精品国产免费一区二区三区香蕉| 自拍偷拍亚洲激情| 激情五月激情综合网| 欧美性猛交xxxxxx富婆| 国产精品美女www爽爽爽| 美女mm1313爽爽久久久蜜臀| 在线一区二区三区做爰视频网站| 久久久青草青青国产亚洲免观| 亚洲午夜在线视频| 色综合中文综合网| 欧美在线一二三| 亚洲在线视频一区| 国产精品久久久久毛片软件| 午夜久久福利影院| 日本道精品一区二区三区| 日本一区二区三级电影在线观看| 青青青伊人色综合久久| 欧美色综合天天久久综合精品| 国产精品午夜在线| 成人永久aaa| 国产欧美一区二区精品性 | 蜜臀a∨国产成人精品| 在线观看av一区二区| 亚洲日本韩国一区| av亚洲产国偷v产偷v自拍| 中文在线免费一区三区高中清不卡| 奇米影视7777精品一区二区| 欧美精品777| 日本亚洲免费观看| 日韩视频不卡中文| 麻豆一区二区三| 精品国产一二三区| 国产一区欧美日韩| 国产色一区二区| 成人精品免费网站| 亚洲精品中文在线观看| 日本道精品一区二区三区| 亚洲国产精品麻豆| 在线电影院国产精品| 精品午夜久久福利影院| 久久久久亚洲蜜桃| 99精品久久只有精品| 亚洲一区二区在线视频| 3d动漫精品啪啪一区二区竹菊 | 国产精品1区2区| 中文字幕一区二区三| 日本久久精品电影| 亚洲大片在线观看| 精品国产亚洲在线| 成人福利视频在线| 亚洲制服丝袜av| 日韩久久久久久| eeuss影院一区二区三区| 亚洲精品国产无天堂网2021| 欧美一区二区大片| 成人免费va视频| 肉丝袜脚交视频一区二区| 精品国产一区二区亚洲人成毛片| 国产成人av影院| 五月天丁香久久| 中文字幕精品一区二区三区精品| 一本一道久久a久久精品| 久久99精品一区二区三区| 亚洲欧洲另类国产综合| 91精品国产aⅴ一区二区| 不卡在线观看av| 久久99精品久久只有精品| 亚洲免费av观看| 337p粉嫩大胆噜噜噜噜噜91av| 在线看国产一区二区| 国产成人精品亚洲午夜麻豆| 午夜精品成人在线视频| 亚洲桃色在线一区| 久久久亚洲午夜电影| 在线播放中文字幕一区| 色综合天天综合网天天狠天天 | 久久嫩草精品久久久久| 粉嫩aⅴ一区二区三区四区| 亚洲一区二区免费视频| 国产三级精品视频| 日韩精品在线网站| 欧美日韩国产a| 99精品视频在线免费观看| 国产一区二区三区在线观看免费| 亚洲综合一区二区三区| 欧美国产一区视频在线观看| 精品国产在天天线2019| 欧美一区二区美女| 欧美电影精品一区二区| 日韩精品一区二区三区四区视频|