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结果是这样:

mysql判断字符串结尾 mysql判断字符串是否为数字_mysql


mysql判断字符串结尾 mysql判断字符串是否为数字_mysql判断字符串结尾_02


再比如比较运算:

select 1=1;
select 1=2;

这个太简单我就不贴图了.

二. 那数字和字符串之间呢?

1. 字符串是数字的逻辑运算

select 1 and '1',1 and '0';

这种情况, 一开始我以为字符串, 按照之前提到的数字类型非0都是true的想法, 字符串也不是数字0, 应该算是true. 结果发现是这样的:

mysql判断字符串结尾 mysql判断字符串是否为数字_数据库_03


将字符串转为了数字来处理.

2. 字符串是英文的逻辑运算

select 1 and 'abc'

这个执行结果是这样的

mysql判断字符串结尾 mysql判断字符串是否为数字_数据库_04


那是不是可以断定, 字符串如果不是数字, 就肯定都是看作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

上面需要关注几条

  1. 第2,3条. 第3条select '2abc' = 0 ; -- 0, false这个符合我一开始的理解, 因为按上面说的, 字符串数字开头就当数字来处理, 那2开头自然不是false, 即不是0. 但是第2条select '2abc' = 1 ; -- 0, false这个却告诉我我的理解有误.
    我理解的错误是把and逻辑运算, 和这里混淆了. and逻辑运算结果是只有1和0. 但是这里是为了探究字符串到底会转变成什么数字. 看第4条我们就知道, 它是解析最开头的数字来当成这个字符串的数字
  2. 关注第7,8条. 第7条select '02a' = 0; -- 0,false, 和select '02a' = 2; -- 1,true可以得知它会忽略开头的0位.
  3. 关注最后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 比较运算

  1. 数字和数字比较, 字符串和字符串比较, 都会按字面比较
  2. 数字和字符串比较, 会把字符串转成数字, 再比较
  3. 数字和字符串相加减, 也会将字符串转为数字

3.2 逻辑运算

  1. 数字和数字 运算, 会将数字转成boolean(true和false), 非0的都是true
  2. 数字和字符串运算, 会先把字符串转成数字, 再把数字转成boolean

字符串转数字

截取字符串最前面的一段数字, 包括负数, 小数点. 如果没有数字则为0

熟悉了上面几个原则后, 再反过头来看上面的例子也就能解释得通了