【技术累积】【点】【sql】【15】MySQL的TEXT和SELECT问题
说明
只是TEXT和SELECT两个东西相关的问题,并不是两者之间的关系。
TEXT
TEXT类型,大文本类型,细分起来还有BIGTEXT,TINYTEXT等;
总体而言,就是处理mysql中存储大文本的一种数据类型。
先上结论:慎用,少用,即使用也要限制好,控制性能。
Innodb的存储结构
- 从大到小是:表空间-段-区-页/块-行
- 磁盘管理的最小单位是页;
- 数据存放是按行来存放的,即存储引擎是面向行的;
- 页的大小固定为16kb,且不能更改;
-
由于innodb存储引擎表为索引组织表,树底层的叶子节点为一双向链表,因此每个页中至少应该有两行记录,这就决定了innodb在存储一行数据的时候不能够超过8k(8098字节)
TEXT和BLOB
使用这种大数据类型,如果值比较大,InnoDB会使用专门的“外部”存储区域来进行存储;
行内仅使用1-4个字节存储一个指针。
取用的时候同理,会创建临时表;
若临时表太大,超过设定值,则会存储在磁盘上,性能会有较大下降;
SELECT打印输出
SELECT something
可以作为mysql的输出语句,遇到问题可以去查看下;
下面说下遇到的问题:
问题描述
SELECT id,interaction_type,reply_type
FROM chat_log
WHERE status=0
AND interaction_type IN ('a')
AND reply_type IN ('c' OR 'd')
在条件中,in的括号中,错误的把,写成了OR;
正常运行中,发现查出的结果并不是想要的;
跟踪之后,发现mybatis没有报错,但是sql中确实写成了or;
问题解决和探究
解决很简单,就改成,即可
SELECT id,interaction_type,reply_type
FROM chat_log
WHERE status=0
AND interaction_type IN ('a')
AND reply_type IN ('c' , 'd')
但为什么之前的写法可以运行呢?
用select看下条件
SELECT ('c' OR 'd')
//结果为0
有了or,尝试下and
SELECT ('c' AND 'd')
//结果为0
有了String,尝试下其他的
SELECT ('c' AND 1) //结果为0
SELECT ('0' AND '1') //结果为0
SELECT (0 OR '1') //结果为1
可以初步判定,条件中是一个表达式,且是逻辑运算的/位运算的;
下面就又有问题了,原来有问题的语句其实等价于
SELECT id,interaction_type,reply_type
FROM chat_log
WHERE status=0
AND interaction_type IN ('a')
AND reply_type IN (0)
ORDER BY created_date DESC
SELECT id,interaction_type,reply_type
FROM chat_log
WHERE status=0
AND interaction_type IN ('a')
AND reply_type = 0
ORDER BY created_date DESC
运行之后,结果表明一致。
改成1,尝试下,发现什么都查不出来;
改成FALSE,尝试结果表明,和0一样;
改写语句
SELECT COUNT(*)
FROM chat_log
WHERE reply_type = FALSE
会得到全表数据量,true则为空
初步猜测结论:
- varchar 是否为true,是看varchar是否为bit类型
但具体是为啥,还是没搞清楚,希望各位大佬指点