关于mysql中string和number的转换问题


Posted in MySQL onJune 14, 2022

mysql中string和number的转换

今天无意中发现一个很奇怪的现象,在写sql语句的时候,想筛选列值为空字符串的记录,结果把列值为0的记录也一起筛选出来了

总结原因如下

当非同类型比较,等号两边分别为number和string之一时候,mysql会把string类型和number类型进行转换:

(1)数值型字符串

如''、'string'、'abc'等,会转换成0

eg:

select '' = 0 from dual;   ---结果:1
select 'a' = 0 from dual;   ---结果:1

(2)number和string拼接字符串

如'123string'、'0123string'等,会取头部类型进行转换

eg:

select '123abc' = 0 from dual;   ---结果:0
select '123abc' = 123 from dual;   ---结果:1
select '0123abc' = 123 from dual;   ---结果:1
select '123abc' + '23def' from dual;   ---结果:146

(3)string和number拼接字符串

如'string123'、'string0123'等,会取头部类型进行转换

eg:

select 'abc123' = 0 from dual;   ---结果:1
select 'abc123' = 123 from dual;   ---结果:0
select 'abc123' + 'def45' from dual;   ---结果:0

(4)数值型字符串则会转换成相应的number

如'123'->123、'023'->23等

eg:

select '123' = 0 from dual;   ---结果:0
select '123' = 123 from dual;   ---结果:1
select '0123' = 123 from dual;   ---结果:1

(5)number则直接转换成对应的string

eg:

select 123 = '123' from dual;   ---结果:1

所以针对我遇到的问题,mysql把''当成字符串处理,转换成了0,0=0,所以把列值为0的记录也一并筛选了出来

+号的处理方式同理:

如果+号两边类型不一致,则把string转换成number处理

select '0string' + 0 = 'string' from dual;   ---结果:1   '0string' + 0 -> 0 + 0 = 0,0和'string'进行比较
select 'string' = 'string' + 0 from dual;   ---结果:1   'string' + 0 -> 0 + 0 = 0,'string'和0进行比较
select 'string' + 0 = 'string' + 0 from dual;   ---结果:1   'string' + 0 -> 0 + 0 ,0和0进行比较
select 'string' + 0 = 'string' + 1 from dual;   ---结果:0   'string' + 0 -> 0 + 0 ,'string' + 1 -> 0 + 1,0和1进行比较

参考链接:http://stackoverflow.com/questions/22080382/mysql-why-comparing-a-string-to-0-gives-true

附赠mysql文档说明:https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

mysql中hex、varchar、number相互转换

hex(‘20')= 14
select HEX(20) from DUAL – result: 14

然后这串数字就能变为16进制字符串,只需要加上0x的前缀!

  • UNHEX(‘14’) – 每对十六进制数字转化为一个字符。
  • UNHEX(‘14’),对应 SI, 该字符无法正确输出

但是ORDER BY UNHEX(‘14’) 是可以的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
MySQL 角色(role)功能介绍
Apr 24 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL约束超详解
Sep 04 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 #MySQL
手把手带你彻底卸载MySQL数据库
MYSQL中文乱码问题的解决方案
Jun 14 #MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 #MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 #MySQL
MySQL安装失败的原因及解决步骤
MySQL范围查询优化的场景实例详解
Jun 10 #MySQL
You might like
PHP实现二维数组去重功能示例
2017/01/12 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
js获取div高度的代码
2008/08/09 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
python常见排序算法基础教程
2017/04/13 Python
Python的多维空数组赋值方法
2018/04/13 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
建筑设计学生的自我评价
2014/01/16 职场文书
环保标语口号
2014/06/13 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
员工离职通知函
2015/04/25 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
学籍证明模板
2015/06/18 职场文书