位置: 编程技术 - 正文

MySQL的隐式类型转换整理总结(mysql隐式类型转换规则)

编辑:rootadmin

推荐整理分享MySQL的隐式类型转换整理总结(mysql隐式类型转换规则),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql 隐式游标,mysql隐藏字段,mysql隐式转换索引失效,mysql隐式类型转换,mysql隐式类型转换规则,mysql隐式类型转换,mysql隐式主键,mysql 隐式锁,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

前几天在看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下。希望对大家有所帮助。

当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。

比如下面的例子:

很明显,上面的SQL语句的执行过程中就出现了隐式转化。并且从结果们可以判断出,第一条SQL中,将字符串的“1”转换为数字1,而在第二条的SQL中,将数字2转换为字符串“2”。

MySQL也提供了CAST()函数。我们可以使用它明确的把数值转换为字符串。当使用CONCA()函数的时候,也可能会出现隐式转化,因为它希望的参数为字符串形式,但是如果我们传递的不是字符串呢:

隐式转化规则

官方文档中关于隐式转化的规则是如下描述的:

If one or both arguments are NULL, the result of the comparison is NULL, except for the NULL-safe <=> equality comparison operator. For NULL <=> NULL, the result is true. No conversion is needed.

If both arguments in a comparison operation are strings, they are compared as strings. If both arguments are integers, they are compared as integers. Hexadecimal values are treated as binary strings if not compared to a number. If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. Note that this is not done for the arguments to IN()! To be safe, always use complete datetime, date, or time strings when doing comparisons. For example, to achieve best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type. A single-row subquery from a table or tables is not considered a constant. For example, if a subquery returns an integer to be compared to a DATETIME value, the comparison is done as two integers. The integer is not converted to a temporal value. To compare the operands as DATETIME values, use CAST() to explicitly convert the subquery value to DATETIME. If one of the arguments is a decimal value, comparison depends on the other argument. The arguments are compared as decimal values if the other argument is a decimal or integer value, or as floating-point values if the other argument is a floating-point value. In all other cases, the arguments are compared as floating-point (real) numbers.

翻译为中文就是:

两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 两个参数都是字符串,会按照字符串来比较,不做类型转换 两个参数都是整数,按照整数来比较,不做类型转换 十六进制的值和非数字做比较时,会被当做二进制串 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较 所有其他情况下,两个参数都会被转换为浮点数再进行比较

注意点

安全问题:假如 password 类型为字符串,查询条件为 int 0 则会匹配上。

相信上面的例子,一些机灵的同学可以发现其实上面的例子也可以做sql注入。

假设网站的登录那块做的比较挫,使用下面的方式:

MySQL的隐式类型转换整理总结(mysql隐式类型转换规则)

如果username输入的是a' OR 1='1,那么password随便输入,这样就生成了下面的查询:

就有可能登录系统。其实如果攻击者看过了这篇文章,那么就可以利用隐式转化来进行登录了。如下:

之所以出现上述的原因是因为:

下面通过一些例子来复习一下上面的转换规则:

把字符串“aa”和1进行求和,得到1,因为“aa”和数字1的类型不同,MySQL官方文档告诉我们:

When an operator is used with operands of different types, type conversion occurs to make the operands compatible.

查看warnings可以看到隐式转化把字符串转为了double类型。但是因为字符串是非数字型的,所以就会被转换为0,因此最终计算的是0+1=1

上面的例子是类型不同,所以出现了隐式转化,那么如果我们使用相同类型的值进行运算呢?

是不是有点郁闷呢?

之所以出现这种情况,是因为+为算术操作符arithmetic operator 这样就可以解释为什么a和b都转换为double了。因为转换之后其实就是:0+0=0了。

再看一个例子:

现在就看也很好的理解上面的例子了吧。a+b=c结果为1,1在MySQL中可以理解为TRUE,因为'a'+'b'的结果为0,c也会隐式转化为0,因此比较其实是:0=0也就是true,也就是1.

第二个需要注意点就是防止多查询或者删除数据

&#;上面的例子本意是查询id为5的那一条记录,结果把id为6的那一条也查询出来了。我想说明什么情况呢?有时候我们的数据库表中的一些列是varchar类型,但是存储的值为‘'这种的纯数字的字符串值,一些同学写sql的时候又不习惯加引号。这样当进行select,update或者delete的时候就可能会多操作一些数据。所以应该加引号的地方别忘记了。

关于字符串转数字的一些说明

从上面的例子可以看出,当把字符串转为数字的时候,其实是从左边开始处理的。

如果字符串的第一个字符就是非数字的字符,那么转换为数字就是0 如果字符串以数字开头 如果字符串中都是数字,那么转换为数字就是整个字符串对应的数字 如果字符串中存在非数字,那么转换为的数字就是开头的那些数字对应的值

总结

标签: mysql隐式类型转换规则

本文链接地址:https://www.jiuchutong.com/biancheng/349842.html 转载请保留说明!

上一篇:Mysql百万级分页优化技巧(mysql千万级分页优化)

下一篇:mysql 正则表达式查询含有非数字和字符的记录(mysql 正则表达式分组替换)

  • 税务清算都交什么费用
  • 纯外贸企业出口到运费可以抵扣吗
  • 企业购入汽车可以抵扣增值税吗
  • 增值税的视同销售行为有哪些?
  • 开票和收到的款金额不一样怎么办?
  • 处置资产开啥发票
  • 关联企业债资比 企业所得税
  • 应付款多付了怎么处理
  • 小汽车的增值税怎么算
  • 自然人税收系统生产经营怎么申报
  • a3软件怎么反记账
  • 社保基数与工资不符
  • 新会计准则科目编码
  • 已投入使用的机器设备才能计提折旧对吗
  • 私房装修费能在公司报销吗
  • 税费和应交税费一样吗
  • 处置固定资产增值税和所得税报税能一致吗
  • 冲销估价入账
  • 溢价发行的债券,当债券临近到期日时,债券价格
  • 小企业营业外收入明细
  • 来料加工税务账应采取哪种核算方式?
  • 银行贷款利息是百分比还是千分比
  • 从境外取得的佣金
  • 企业间借款利息怎么算
  • 企业所得税是按季度还是按月
  • 自然人个税起征点2019税率表
  • 每个月的股利怎么计提?
  • 年末应计提坏账准备为什么是负数
  • 增值税电子发票公共服务平台
  • 利润的计算公式excel
  • 设备安装服务几个点
  • 仲裁规则主要包括
  • 64位windows系统下安装Memcache缓存
  • 记账凭证的摘要是什么意思
  • windows 11预览版
  • 公司出租房屋怎样开发票的税务局率?
  • 准公益性企业
  • 尚融宝盈(宁波)投资中心(有限合伙)
  • 餐饮企业原材料成本如何分析
  • 保理属于什么行业分类
  • 补缴企业所得税的计算公式
  • 应收账款提了坏账后收回
  • ps使用背景橡皮擦的时候需要按住什么键
  • xml 入门
  • 销售商品的折扣
  • 股东退股怎么入账
  • mongodb数据库的作用
  • 原材料折价销售怎么算
  • 个税哪种申报方式好
  • 可以单独设置一个人三天可见吗
  • php怎么连接sqlserver
  • 固定资产盘盈影响所有者权益吗
  • 计提递延所得税资产影响当期利润吗
  • 财务制度设置
  • 独资合伙企业的特点
  • 残保金计算公式及例题
  • 应付账款账面价值扣除商业折扣吗
  • 福利费可以不走应付职工薪酬吗
  • 非正常损失的进项税
  • 免予缴纳增值税
  • 小规模纳税人本期应纳税额
  • 申报和做账必须一致吗
  • 小微企业未开票收入怎么申报
  • 税局代开专用发票时交的钱如何记账?
  • 二次加工型的企业有哪些
  • winrecon.exe - winrecon是什么进程
  • linux 追踪
  • 无需u盘安装系统
  • win7设置宽带拨号
  • windows7开机显示错误恢复进不去
  • win7删除文件
  • android开发流程
  • nodejs xhr
  • 特征提取技术
  • vb中chr$(13)是什么意思
  • python程序解析
  • 房屋设备租赁费
  • 非贸付汇代扣代缴企业所得税
  • 个人劳务承包需要什么资质
  • 福建原盐和自然盐有什么区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设