mysql中字符串的逻辑运算和比较运算
- 一. 数字和数字运算
- 二. 那数字和字符串之间呢?
- 1. 字符串是数字的逻辑运算
- 2. 字符串是英文的逻辑运算
- 3. 各种情况
- 3.1 = 比较运算
- 3.2 and逻辑运算
- 三. 整理总结
- 3.1 比较运算
- 3.2 逻辑运算
- 字符串转数字
一. 数字和数字运算
mysql的逻辑运算, and, or, xor, not等
比如:
select 1 and 2;
select 1 and 0;
这个相信大家都知道, mysql里面, 数字0表示false
, 除了0外的数字表示true
. 所以上面的sql结果是这样:
再比如比较运算:
select 1=1;
select 1=2;
这个太简单我就不贴图了.
二. 那数字和字符串之间呢?
1. 字符串是数字的逻辑运算
select 1 and '1',1 and '0';
这种情况, 一开始我以为字符串, 按照之前提到的数字类型非0都是true的想法, 字符串也不是数字0, 应该算是true. 结果发现是这样的:
即 将字符串转为了数字来处理.
2. 字符串是英文的逻辑运算
select 1 and 'abc'
这个执行结果是这样的
那是不是可以断定, 字符串如果不是数字, 就肯定都是看作false呢?
我一开始是这样以为的, 但是结果发现在执行某个sql的时候得到了以外的结果. 和字符串的and运算得到了1.
所以答案是 不对
3. 各种情况
最后我尝试了n种字符串, 最后看到一个资料是这样说的. 字符串如果是以数字开头, 会解析成数字来进行逻辑判断.
https://codingdict.com/questions/21216
3.1 = 比较运算
select 'abc' = 0 ; -- 1, true
select '2abc' = 1 ; -- 0, false
select '2abc' = 0 ; -- 0, false
select '2abc' = 2 ; -- 1,true
select '22abc' = 22 ; -- 1,true
select '0a' = 0; -- 1,true
select '02a' = 0; -- 0,false
select '02a' = 2; -- 1,true
select '0a0a' = 0; -- 1,true
select 'abc' = 0 ; -- 1, true
select 'abc' = 'cde' ; -- 0, false
select '0abc' = '0cde' ; -- 0, false
select 'abc' + 0 = 'cde' ; -- 1, true
select '0abc' + 0 = '0cde' ; -- 1, true
上面需要关注几条
- 第2,3条. 第3条
select '2abc' = 0 ; -- 0, false
这个符合我一开始的理解, 因为按上面说的, 字符串数字开头就当数字来处理, 那2开头自然不是false, 即不是0. 但是第2条select '2abc' = 1 ; -- 0, false
这个却告诉我我的理解有误.
我理解的错误是把and逻辑运算, 和这里混淆了. and逻辑运算结果是只有1和0. 但是这里是为了探究字符串到底会转变成什么数字. 看第4条我们就知道, 它是解析最开头的数字来当成这个字符串的数字 - 关注第7,8条. 第7条
select '02a' = 0; -- 0,false
, 和select '02a' = 2; -- 1,true
可以得知它会忽略开头的0位. - 关注最后4条,
select 'abc' = 'cde' ; -- 0, false
表示如果直接用字符串对比, 不会转为数字. 我们可以select 'abc' + 0 = 'cde' ; -- 1, true
这样通过运算来转换成数字
再看看小数点的特殊情况:
select '1.2abc' = 1.2; -- 1,true
select '11.2abc' = 11.2; -- 1,true
select '-0.2abc' = -0.2; -- 1,true
3.2 and逻辑运算
上面是尝试了 =
逻辑判断, 这里再试试逻辑运算and
select 1 and 2; -- 1,true
select 1 and 0; -- 0,false
select 'abc' and 'cde'; -- 0,false
select 'abc' and 1;-- 0,false
select '2abc' and '1cde'; -- 1,true
select '2abc' and 1; -- 1,true
select '02abc' and 1; -- 1,true
三. 整理总结
3.1 比较运算
- 数字和数字比较, 字符串和字符串比较, 都会按字面比较
- 数字和字符串比较, 会把字符串转成数字, 再比较
- 数字和字符串相加减, 也会将字符串转为数字
3.2 逻辑运算
- 数字和数字 运算, 会将数字转成boolean(true和false), 非0的都是true
- 数字和字符串运算, 会先把字符串转成数字, 再把数字转成boolean
字符串转数字
截取字符串最前面的一段数字, 包括负数, 小数点. 如果没有数字则为0
熟悉了上面几个原则后, 再反过头来看上面的例子也就能解释得通了