MySQL字符串进行加减乘除的运算
2024-08-24 03:38:15
原文链接: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码的比较结果作为最终结果
最新文章
- 商业智能软件对比评测:FineBI和Tableau
- 【bzoj1060】[ZJOI2007]时态同步
- Android Log介绍
- 傅盛谈管理的本质zz
- 使用Android Studio打Andorid apk包的流程
- ant+jenkins+testng+selenium集成环境搭建
- R-Studio
- unix 中 ps -ef命令详解
- 正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr
- vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法
- 【转】Linux 技巧: Bash 参数和参数扩展
- 10 Best Responsive HTML5 Frameworks and Tools
- 【转】改善C#程序的建议2:C#中dynamic的正确用法 空间
- Android studio教程:[1] 创建app项目
- AndroidUI 侧滑菜单 DrawerLayout的使用
- MSMQ队列学习记录
- PHP多进程编程pcntl_fork解
- [csdn markdown]使用摘记三 简便快捷的流程图
- tarjan算法讲解。
- es6学习笔记-Symbol
热门文章
- Mybatis框架基础支持层——反射工具箱之对象工厂ObjectFactory&;DefaultObjectFactory(5)
- TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)
- response.write
- laravel框架使用中错误及解决办法总结
- 当input框输入到限定长度时,自动focus下一个input框
- 从淘宝和网易的font-size思考移动端怎样使用rem?
- js中slice,SubString和SubStr的区别
- ajax请求code:200但是进入error函数
- Azure WebJob-Custom Schedule for Azure Web Job Timer Triggers
- 通过Excel文件快速创建页面和数据表