MySql中Char类型数据比较大小的问题

MySql中Char类型数据比较大小的问题,第1张

char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:

char(m)类型的数据列里,每个值都占用m个字节,如果某个长度小于m,mysql就会在它的右边用空格字符补足.(在检索 *** 作中那些填补出来的空格字符将被去掉)在varchar(m)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为l+1字节).

在mysql中用来判断是否需要进行对据列类型转换的规则

1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.

2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.

3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,mysql会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.

例外:长度小于4个字符的char数据列不会被转换为varchar类型

希望对你有帮助

在数据库中当然是可以对001和005使用聚合函数max()进行大小比较的,但是我们必须要留意文本型数值和数字型数值在比较数值大小时,数据库引擎对不同的字段数据类型其比较的结果可能会有所不同!下面举例说明一下:

比如 10和9,按数字比较大小则 10>9,但是如果按文本比较大小则 '10'<'9',因为两个字串比较大小时是从左边第一个字符开始逐个字符进行比较的,一旦分出高低,比较将立即结束不再进行余下比较。'10'开头为1,'9'开头为9首尾字符即可分出大小,这样文本数字'10'就会小于文本数字'9'。我们再来看看001和005,则不论是按数字类型还是按文本类型比较均为前者小于后者,按数字比较的话自然1小于5,若按字串比较,前两位打成平手到第三个字符时就分出了大小。

数据库中字符和字串比较大小的排序规则基本上与我们日常使用的字词典里的排序规则相互吻合,两个字符或字串根据它们在字典中的排序位置我们通常不必依赖电脑运算就可以判断出谁大谁小。

现在我们实测一下使用聚合函数Max()对比文本数据类型字段和数字类型字段的比较结果,以下是SQL实验代码:

drop table if exists t2

-- 创建测试表t2含文本数据型“数字”字段和数字类型字段

create table t2(id int auto_increment primary key,

charNum varchar(10),digitNum int)

-- 插入测试数据

insert into t2(charNum,digitNum) values

('001',1),('005',5),('0010',10)

-- 查看待测数据

select * from t2

-- 直接选出文本“数字”字段中的最大值和数字字段中的最大值

select max(charNum) as maxCharNum,

max(digitNum) as maxDigitNum from t2

-- 将文本“数字”字段转换为数字类型后再选出其最大值,以及直接选出数字字段最大值

select max(convert(charNum,signed)) as maxConvertCharNum,

max(digitNum) as maxDigitNum from t2

测试截图:

待测数据:

直接对文本和数字两种数据类型字段使用Max()函数的返回结果对比:

我们可以看到直接对文本数据类型字段使用Max函数选出的最大值是“005”而非“0010”

下面是将文本数据类型数字转换为数字数据类型后才使用Max函数的对比结果:

我们可以看到对文本类型字段使用Max函数的最大值已经跟数字数据类型字段的最大值一样了,都是10。

总结:

直接对字符型数据类型字段使用聚合函数Max()、Min()所返回的极值将遵循一般字(词)典对字(词)里设定的排序规则,所选出的最大(小)值不一定是数字意义上的极值,如果需要得出严格数字意义上的极值就必须先进行类型转换,否则得出的结果可能会与期望值有出入。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/6111868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存