【技术累积】【点】【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类型

但具体是为啥,还是没搞清楚,希望各位大佬指点


参考文章

posted @ 2018-09-28 14:08  韧还  阅读(263)  评论(0编辑  收藏  举报