推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Spring】
总结——》【SpringBoot】
Mysql——》索引存储模型推演
当两个不同类型的数据进行运算时,为了使得它们能够兼容,MySQL 可能会执行隐式的数据类型转换(Implicit type conversion)
一、MySQL 自动将字符串转换为数字
- 字符串是以数字开头,且全部为数字,则转换的数字结果为整个字符串
- 字符串是以数字开头,且部分为数字,则转换的数字结果为截止到第一个不是数字的字符
- 字符串不是以数字开头,则转换的数字结果为0
-- 字符串以数字开头,且全部为数字
SET @str1 := '123';
SELECT @str1 = 123;-- 结果:1,代表true
SELECT @str1 = '123';-- 结果:1代表true
SELECT @str1 + 1;-- 结果:124
-- 字符串以数字开头,且部分为数字
SET @str2 := '123abc';
SELECT @str2 = 123;-- 结果:1,代表true
SELECT @str2 = '123';-- 结果:0,代表false
SELECT @str2 + 1;-- 结果:124
-- 字符串不是以数字开头
SET @str3 := 'abc123';
SELECT @str3 = 123;-- 结果:0,代表false
SELECT @str3 = '123';-- 结果:0,代表false
SELECT @str3 + 100;-- 结果:100
二、MySQL 使用函数将数字转换为字符
-- CAST()函数将数字显式转换为字符串
SELECT 1.1, CAST(1.1 AS CHAR);
-- CONCAT()函数将数字隐式转换为字符串
SELECT 1.1, CONCAT(1.1);
三、官方文档关于隐式转换的描述
以下规则描述了比较操作如何进行转换:
- 两个参数中至少有一个是 null 时,比较的结果也是 null,另外使用 <=> 对两个 null 做比较时会返回 1,这两种情况都不需要做类型转换
- 两个参数都是字符串,会按照字符串来比较,不做类型转换
- 两个参数都是整数,按照整数来比较,不做类型转换
- 十六进制的值和非数字做比较时,会被当做二进制串
- 有一个参数是 timestamp 或者 datetime,并且另外一个参数是常量,常量会被转换为 timestamp
- 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
- 其他情况下,两个参数都会被转换为浮点数再进行比较