关于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对于模糊查询like的一些汇总
May 09 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 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生成略缩图代码
2012/07/16 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
Python深入学习之闭包
2014/08/31 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python3实现windows下同名进程监控
2018/06/21 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
护士辞职信范文
2014/01/19 职场文书
运动会入场解说词
2014/02/07 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
800字作文之大雪
2019/12/04 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js