梦想还是要有的,万一忘了咋办?

0%

MySql字符串

目录:

  • 比较
  • 排序

字符串数值比较

从左按位开始比较,相等时向后移位在比较,直到小于、或大于、直接作为最终结果返回;
现象描述:

1
2
3
4
5
6
7
8
9
10
11
12
#1小于2 直接返回0、r=0(false)
SELECT ("18">"2")as r FROM dual ;

#1小于2 直接返回0、r=0(false)
#第二位1小于2 直接返回0、r=0
SELECT ("2133">"22")as r FROM dual ;

#第二位5大于4 直接返回1、r=1(true)
SELECT ("25">"24000")as r FROM dual ;

#数据位都相等时、位数多的大于位数小的、r=1
SELECT "1000" > "1" as r ;

解决方案:

1
2
3
4
5
#+0 、r=1(true)
SELECT ("18">"2"+0)as r FROM dual ;

#将一边转为 decimal类型
SELECT (cast("25" as decimal(18,2)) > "24000" ) as r FROM dual ;

字符串数值排序

依照字符串数值比较逻辑确定大小、

字符串与BIGINT(java里面的Long类型)比较时

浮点数和大INTEGER类型值之间的比较 是近似的,因为整数在比较之前被转换为双精度浮点数,不能准确表示所有 64 位整数。例如,整数值 2 53 + 1 不能表示为浮点数,并且在浮点数比较之前四舍五入为 2^53或 2^ 53 + 2,具体取决于平台。
为了说明这一点,以下比较中只有第一个比较相等的值,但两个比较都返回 true (1):

1
2
3
4
mysql> SELECT '9223372036854775807' = 9223372036854775807;
-> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
-> 1

当发生从字符串到浮点数和从整数到浮点数的转换时,它们不一定以相同的方式发生。CPU 可以将整数转换为浮点数,而在涉及浮点乘法的运算中将字符串逐位转换。此外,结果可能会受到计算机体系结构或编译器版本或优化级别等因素的影响。避免此类问题的一种方法是使用,CAST()以便值不会隐式转换为浮点数:

1
2
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
-> 0

原文地址:https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html