网站建设公司怎么开,东莞邦邻网站建设,seo站长网,北京各大网站推广平台哪家好当运算符与不同类型的操作数一起使用时#xff0c;会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如#xff0c;MySQL会根据需要自动将字符串转换为数字#xff0c;反之亦然。
转换规则 如果一个或两个参数都为NULL#xff0c;则比较结果为NULL 。但是相等比较…当运算符与不同类型的操作数一起使用时会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如MySQL会根据需要自动将字符串转换为数字反之亦然。
转换规则 如果一个或两个参数都为NULL则比较结果为NULL 。但是相等比较运算符除外对于NULLNULL结果为1不需要转换。 如果比较操作中的两个参数都是字符串则将它们作为字符串进行比较不做类型转换。 如果两个参数都是整数则将它们作为整数进行比较不做类型转换。 十六进制的值和非数字做比较时会被当做二进制串。 如果其中一个参数是TIMESTAMP或DATETIME列而另一个参数为常量则在执行比较之前该常量将转换为时间戳。这样做是为了对ODBC更加友好。对于IN( ) 的参数并没有这样做。为了安全起见在进行比较时请始终使用完整的日期时间、日期或时间字符串。例如为了在将BETWEEN与日期或时间值一起使用时获得最佳结果。 来自一个或多个表的单行子查询不被视为常量。例如如果子查询返回一个要与DATETIME 值进行比较的整数则比较将作为两个整数进行。整数不会转换为时间值。要将操作数作为 DATETIME值进行比较请使用 CAST()将子查询值显式转换为DATETIME。 如果其中一个参数是十进制值则比较取决于另一个参数。如果另一个参数是十进制或整数值则将参数作为十进制值进行比较如果另一参数是浮点值则将其作为浮点值进行比较。 在所有其他情况下参数将作为浮点双精度数字进行比较。例如字符串和数字操作数的比较是作为浮点数的比较进行的。
带来的问题
1. 精度丢失导致查询结果错误 浮点数和整数类型的大值的比较是近似的因为整数在比较之前被转换为双精度浮点数不能准确表示所有 64 位整数。 例如整数值 253 1 不能表示为浮点数在进行浮点数比较之前四舍五入为 253 或 253 2具体取决于CPU。 字符串和数字对比都会转化成doublevarchar或 bigint 超过16位转化成 double时会出现精度丢失。
2. 参数类型和字段类型不一致时导致索引失效 当字段类型为字符串时参数类型为整数类型导致索引失效
我们需要充分了解MySQL里隐式类型转换的规则同时日常在写SQL时一定要检查参数类型与数据库字段类型是否一致否则可能造成隐式类型转换不能正常应用索引。