【技术累积】【点】【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类型
但具体是为啥,还是没搞清楚,希望各位大佬指点
参考文章
- 高性能mysql之慎用BLOB与TEXT
- innodb使用大字段text,blob的一些优化建议
- InnoDB的表类型,逻辑存储结构,物理存储结构
- MySQL innoDB索引底层原理详解
- mysql里的打印(输出)是那个命令,就是相当于mssql里的print
- SQL的类型转换
- sql语句中,要提取数据表中某一字段数值为True的数据。
【技术累积】【点】【sql】【15】MySQL的TEXT和SELECT问题的更多相关文章
- 《[MySQL技术内幕:SQL编程》读书笔记
<[MySQL技术内幕:SQL编程>读书笔记 2019年3月31日23:12:11 严禁转载!!! <MySQL技术内幕:SQL编程>这本书是我比较喜欢的一位国内作者姜承尧, ...
- 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB
在当今市场上,存在各种类型的数据库,选择适合你业务类型的数据库对应用的开发和维护有着重要意义.本篇文章,将为大家分享SQL和NoSQL语言之间的区别,同时还将比较这两种类型的数据库,以帮助小伙伴们选择 ...
- 一次故障解决过程梳理:mysql varchar text timestamp
CHAR 类型的一个变体是 VARCHAR 类型,char(M),M是指字节长度,和varchar(M)一样 故障原因:mysql主键设置为int(9),但数据量已经大于int(9)的范围了 tips ...
- SQL之mysql常用操作语句(入门级)
1.进入数据库: mysql -u root -p mysql -h localhost -u root -p database_name 2.列出数据库 show databases; 3.选择数据 ...
- 常用SQL操作(MySQL或PostgreSQL)与相关数据库概念
本文对常用数据库操作及相关基本概念进行总结:MySQL和PostgreSQL对SQL的支持有所不同,大部分SQL操作还是一样的. 选择要用的数据库(MySQL):use database_name; ...
- Mysql 中 text类型和 blog类型的异同
MySQL存在text和blob: (1)相同 在TEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被 ...
- 全国省市级联数据sql语句 mysql版
全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...
- MySQL中TEXT与BLOB字段类型的区别
这篇文章主要介绍了MySQL中TEXT与BLOB字段类型的区别,本文总结了6大区别,需要的朋友可以参考下 在MySQL中有两个字段类型容易让人感觉混淆,那就是TEXT与BLOB,特别是自己写博客程 ...
- Mysql的Text和Blob的比较
MySQL存在text和blob: (1)相同 在TEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值,值被截 ...
随机推荐
- 公钥基本结构(PKI)的概念
公钥证书 ,通常简称为证书 ,用于在 Internet.Extranet 和 Intranet 上进行身份验证并确保数据交换的安全.证书的颁发者和签署者就是众所周知的 证书颁发机构 (CA),将在下一 ...
- 【Codeforces 459D】Pashmak and Parmida's problem
[链接] 我是链接,点我呀:) [题意] 定义两个函数 f和g f(i)表示a[1..i]中等于a[i]的数字的个数 g(i)表示a[i..n]中等于a[i]的数字的个数 让你求出来(i,j) 这里i ...
- 【codeforces 514C】Watto and Mechanism(字符串hash)
[题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...
- 【[Offer收割]编程练习赛12 C】矩形分割
[题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...
- 手动扩栈#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma comment(linker, "/STACK:1024000000,1024000000")
- ZooKeeper的下载方法
1.进入官网: https://zookeeper.apache.org/releases.html 2.进入服务器列表: http://www.apache.org/dyn/closer.cgi/z ...
- HDU 5435
数位DP题,然而不会做.设dp[i][j]表示前i位异或和为j的时候的个数.先dp出所有的可能组合使得异或和为j的个数,然后按位进行枚举.对于dp[i][j],其实不止是前i位,对于后i位的情况同样适 ...
- 1.7-BGP⑥
BGP中的路由控制/过滤: LAB1:Distribute-list调用ACL(较落后) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Step1:通过ACL定义 ...
- 【Hibernate学习】 ——ORM(四)再次认识实体继承
在信用办时.做失信.守信.黑名单这一块的时候.先把原来的需求看了看.紧接着就開始设计实体,这一块大部分都是同样的信息,所以就设计了一个实体,而且用一个状态标识出来是失信.守信还是黑名单. 在之后的改动 ...
- Wikioi 1081 线段树成段更新单点查询
线段树练习飘逸的写法,自从自己改成这样的写法之后,线段树就没再练过,如今最终练得上了. 由于这里查询仅仅是查询了叶子结点,所以pushUp函数就用不上了,只是我没去掉之前是3ms.去掉之后反而变成4m ...