zoukankan      html  css  js  c++  java
  • 【技术累积】【点】【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类型

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


    参考文章

  • 相关阅读:
    移动端--基于Android Studio的项目文件结构(一)【转】
    java知识体系粗略梳理
    简单的使用hibernate插入数据的例子
    触发器
    存储过程和函数
    视图
    索引的设计和使用
    数据类型的选择
    表类型(存储引擎)的选择
    MySQL中的常用函数
  • 原文地址:https://www.cnblogs.com/andy1202go/p/9718229.html
Copyright © 2011-2022 走看看