zoukankan      html  css  js  c++  java
  • MySQL字符串进行加减乘除的运算

     原文链接:https://www.jianshu.com/p/2ab2c0dc3cb5

    在mysql当中,字符串类型间进行加减乘除运算的时候,会截取字符串以数字开头的那一部分数字进行运算,如果字符串前面没有数字,那么就只能截取的数值为0,那么进行加减的时候结果都是0,进行乘除的时候结果都是NULL,如下几个结果说明问题:

    mysql> select '1a'+'1b'; +-----------+ | '1a'+'1b' | +-----------+ | 2 | +-----------+ 1 row in set, 2 warnings (0.00 sec)
    mysql> select '2a'-'1b';
    +-----------+
    | '2a'-'1b' |
    +-----------+
    |         1 |
    +-----------+
    1 row in set, 2 warnings (0.00 sec)
    
    mysql> select '1a'/'2b';
    +-----------+
    | '1a'/'2b' |
    +-----------+
    |       0.5 |
    +-----------+
    1 row in set, 2 warnings (0.00 sec)
    
    mysql> select 'a'/'b';
    +---------+
    | 'a'/'b' |
    +---------+
    |    NULL |
    +---------+
    1 row in set, 3 warnings (0.00 sec)
    
    mysql> select 'a' - 'b';
    +-----------+
    | 'a' - 'b' |
    +-----------+
    |         0 |
    +-----------+
    1 row in set, 2 warnings (0.00 sec)
    
    mysql> select 'a' + 'b';
    +-----------+
    | 'a' + 'b' |
    +-----------+
    |         0 |
    +-----------+
    1 row in set, 2 warnings (0.00 sec)
    

    如果一个字符串以数字开头,后面有非数字和数字组合的话,在进行运算的时候,会省略掉非数字和数字组合那一段,也就是只会截取开头的数字

    mysql> select '2015-2-1' - '2015-1-1';
    +-------------------------+
    | '2015-2-1' - '2015-1-1' |
    +-------------------------+
    |                       0 |
    +-------------------------+
    1 row in set, 2 warnings (0.00 sec)
    

    以上相当于2015-2015=0

    mysql当字符串进行大小比较的时候

    mysql> select '2015-2-1' > '2015-1-1';
    +-------------------------+
    | '2015-2-1' > '2015-1-1' |
    +-------------------------+
    |                       1 |
    +-------------------------+
    1 row in set (0.00 sec)
    
    mysql> select '2015-2-1' < '2015-1-1';
    +-------------------------+
    | '2015-2-1' < '2015-1-1' |
    +-------------------------+
    |                       0 |
    +-------------------------+
    1 row in set (0.00 sec)
    

    在这里非常奇怪,'2015-2-1' - '2015-1-1' = 0,为什么大小比较的时候会有大小之分呢?

    原来对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较,若字符是非数字那么会转换为ascii码进行比较,若在某位置上已经有大小之分,那么就不会再进行比较。

    mysql> select '2017-03-20 15:27:49' > '2017-03-20 15:27:48';
    +-----------------------------------------------+
    | '2017-03-20 15:27:49' > '2017-03-20 15:27:48' |
    +-----------------------------------------------+
    |                                             1 |
    +-----------------------------------------------+
    1 row in set (0.00 sec)
    

    看起来像日期的字符串可以用date_format函数提取当中的年月日,看如下:

    mysql> select date_format('2017/03/20 15:27:49','%Y') 年,date_format('2017/03/20 15:27:49','%c') 月,date_format('2017/03/20 15:27:49','%d') 日;
    +------+------+------+
    | 年   | 月   | 日   |
    +------+------+------+
    | 2017 | 3    | 20   |
    +------+------+------+
    1 row in set (0.00 sec)
    
    

    非数字字符在比较大小的时候,就例如:

    mysql> select 'a' < 'b';
    +-----------+
    | 'a' < 'b' |
    +-----------+
    |         1 |
    +-----------+
    1 row in set (0.00 sec)
    

    当中的字母会转成ascii码,再进行比较,以上是单字母字符串比较,如果是多字母数字混合字符串比较呢?

    mysql> select '1c' > 'bc';
    
    +-------------+
    | '1c' > 'bc' |
    +-------------+
    |           0 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> select '1yz' > 'abc999';
    +------------------+
    | '1yz' > 'abc999' |
    +------------------+
    |                0 |
    +------------------+
    1 row in set (0.00 sec)
    

    其实从上面的结果大概可以猜测得到,为让解释更清晰更有说服力,再看下图:

    mysql> select ascii('1c'),ascii('bc');
    +-------------+-------------+
    | ascii('1c') | ascii('bc') |
    +-------------+-------------+
    |          49 |          98 |
    +-------------+-------------+
    1 row in set (0.00 sec)
    
    
    mysql> select ascii('1yz'),ascii('abc999');
    +--------------+-----------------+
    | ascii('1yz') | ascii('abc999') |
    +--------------+-----------------+
    |           49 |              97 |
    +--------------+-----------------+
    1 row in set (0.00 sec)
    

    字符串大小比较的时候,会从左向右将两个字符串第一个不相等的两个字符的ascii码的比较结果作为最终结果



  • 相关阅读:
    Sample XPS Documents Download
    触发器中的inserted表和deleted表
    Using freewheel.labs.autodesk.com to auto generate preview images of DWF files on your web site
    解除SQL对组件"Ad Hoc Distributed Queries"的"STATEMENT'OpenRowset OpenDatasource"的访问
    读写xps
    XPS文件,在Windows XP下的打开查看阅读和打印方法。
    Learning to Reference Inserted and Deleted Tables
    Get value from updated, inserted and deleted
    Reinstall Microsoft Helper Viewer
    如何查找文件的IFilter
  • 原文地址:https://www.cnblogs.com/codeAB/p/10120163.html
Copyright © 2011-2022 走看看