MySQL 中 LIKE 语句的 `%` 和 `_` 以及 BLOB 和 TEXT 的详细解析和案例示范

devtools/2024/10/18 21:59:06/

1. LIKE 语句中的 %_ 用法

1.1 % 通配符的用法

% 通配符代表零个或多个字符。它是 MySQL 中用于模糊匹配的强大工具之一,可以在任何字符的位置使用。

示例 1:查找以特定字符开头的记录

假设我们有一个电商订单系统的 orders 表,其中包含客户订单信息。我们希望查找所有以 A 开头的客户姓名。

SELECT * FROM orders WHERE customer_name LIKE 'A%';

在这里,A% 将会匹配所有以 A 开头的名字,无论后面跟随多少字符。例如,Alice, Adam, Amanda 等都会被匹配到。

示例 2:查找以特定字符结尾的记录

假设我们想查找以 .com 结尾的所有邮箱地址。

sql复制代码SELECT * FROM orders WHERE email LIKE '%.com';

此查询将返回所有邮箱以 .com 结尾的记录,比如 example@gmail.comuser@domain.com

示例 3:查找包含特定子串的记录

我们可以通过 % 在字符串两端使用,查找包含某个子串的记录。

SELECT * FROM orders WHERE product_name LIKE '%Phone%';

此查询将返回所有包含 Phone 的产品名称,如 iPhone, Samsung Phone, Pixel Phone

1.2 _ 通配符的用法

_ 通配符代表单个字符,类似于正则表达式中的 .。在需要匹配特定位置的单个字符时非常有用。

示例 1:匹配固定长度的字符串

假设我们想查找那些长度为 4 个字符,且以 T 开头的产品名称。

SELECT * FROM products WHERE product_code LIKE 'T___';

在这里,T___ 将会匹配 T 开头,后跟三个字符的任何字符串,比如 TV01, T123, T999 等。

示例 2:查找特定位置的字符

假设我们有一组邮政编码,我们想查找所有第二位是数字 5 的邮政编码。

SELECT * FROM addresses WHERE postal_code LIKE '_5%';

此查询将返回所有第二个字符为 5 的邮政编码,比如 15000, 25100, 35123 等。


2. BLOB 和 TEXT 的区别

BLOB 和 TEXT 是 MySQL 中用于存储大量数据的两种数据类型。尽管它们看起来非常相似,但它们有几个关键的区别,特别是在存储、性能和应用场景方面。

2.1 BLOB 数据类型

BLOB(Binary Large Object) 是用于存储二进制数据的大型对象,如图片、视频、音频文件等。BLOB 类型专门设计用于处理不可读的数据,这些数据通常是通过应用程序处理的。

BLOB 的种类

MySQL 提供了 4 种不同大小的 BLOB 类型:

  • TINYBLOB:最大 255 字节
  • BLOB:最大 65,535 字节(64 KB)
  • MEDIUMBLOB:最大 16,777,215 字节(16 MB)
  • LONGBLOB:最大 4,294,967,295 字节(4 GB)
示例 1:存储图片文件

假设我们有一个 products 表,其中有一列 image_data 用于存储产品的图片文件。

CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(255),image_data BLOB
);

我们可以通过以下语句将图片文件插入到 image_data 中:

INSERT INTO products (product_id, product_name, image_data)
VALUES (1, 'Product A', LOAD_FILE('/path/to/image.jpg'));
BLOB 的常见应用场景
  • 存储图片、音频、视频文件:由于 BLOB 是二进制数据,因此非常适合存储大容量的多媒体文件。
  • 加密数据:加密后的数据也是二进制形式,适合使用 BLOB 存储。

2.2 TEXT 数据类型

TEXT 类型用于存储大文本数据,如评论、文章或日志信息。与 BLOB 不同,TEXT 是用于存储字符串数据,并且能够进行排序和比较。

TEXT 的种类

MySQL 也提供了 4 种不同大小的 TEXT 类型:

  • TINYTEXT:最大 255 字符
  • TEXT:最大 65,535 字符(64 KB)
  • MEDIUMTEXT:最大 16,777,215 字符(16 MB)
  • LONGTEXT:最大 4,294,967,295 字符(4 GB)
示例 2:存储产品描述

假设我们有一个 products 表,其中有一列 description 用于存储产品的长描述信息。

CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(255),description TEXT
);

我们可以通过以下语句插入一条长文本描述:

INSERT INTO products (product_id, product_name, description)
VALUES (1, 'Product A', 'This is a detailed description of Product A.');
TEXT 的常见应用场景
  • 存储文章、评论、产品描述:任何需要大量文本存储的场景都可以使用 TEXT 类型。
  • 存储 HTML 或 XML 数据:TEXT 也可以用来存储结构化文本数据,比如 HTML 或 XML。

2.3 BLOB 和 TEXT 的主要区别

特性BLOBTEXT
数据类型存储二进制数据(如图像、视频等)存储字符数据(如文本、文章、描述等)
排序和比较无法直接排序或比较可以排序和比较
索引处理BLOB 列不支持前缀索引TEXT 列支持前缀索引
存储用途适合存储不可读的二进制数据适合存储可读的文本数据
常见使用场景多媒体文件、加密数据长文本、文章、日志信息

3. LIKE 语句结合 BLOB 和 TEXT 的使用场景

在实际应用中,BLOB 和 TEXT 通常不会与 LIKE 语句一起使用,因为 BLOB 存储的是二进制数据,不适合字符串匹配查询。然而,TEXT 类型是存储字符串的,因此可以结合 LIKE 进行模糊查询。

示例:查找包含特定关键字的文章

假设我们有一个 articles 表,其中包含大量文章内容。我们想查找所有包含关键词 “MySQL” 的文章。

SELECT * FROM articles WHERE content LIKE '%MySQL%';

由于 content 列是 TEXT 类型的,因此可以用 LIKE 进行模糊查询,匹配包含 MySQL 的文章。


4. BLOB 和 TEXT 的性能问题

在实际应用中,BLOB 和 TEXT 的使用需要考虑性能问题。以下是一些关于性能优化的建议:

4.1 索引的影响

虽然 TEXT 列可以创建前缀索引,但由于 TEXT 和 BLOB 数据的大小,索引可能会增加数据库的存储开销,并且影响查询性能。因此,通常我们只会在较短的前缀上创建索引。例如,我们可以在 TEXT 列的前 255 个字符上创建索引。

CREATE INDEX idx_content ON articles(content(255));

这样可以加速 LIKE 语句的查询,但前提是我们只匹配前缀内容。

4.2 存储与查询的分离

在某些情况下,存储 BLOB 或大文本数据的列会影响查询性能。为了优化性能,许多应用会将 BLOB 或 TEXT 列与其他列分离,甚至将 BLOB 数据存储在文件系统中,而不是数据库中。

4.3 定期清理和归档

随着时间的推移,存储大量 BLOB 和 TEXT 数据会占用大量存储空间。为了保持性能,建议定期清理或归档不再使用的数据。


5. 总结

通过这篇文章,我们详细讨论了 MySQL 中 LIKE 语句的 %_ 通配符的使用方法,展示了它们在各种查询场景中的应用。同时,我们深入探讨了 BLOB 和 TEXT 数据类型的区别、应用场景及性能问题。在处理大文本数据时,TEXT 类型结合 LIKE 语句的模糊查询功能,能够非常高效地处理复杂的文本匹配问题。


http://www.ppmy.cn/devtools/126833.html

相关文章

OpenFeign 入门与实战:快速搭建 Spring Cloud 微服务客户端

1. 前言 随着微服务架构的流行,服务之间的通信变得越来越重要。Spring Cloud 提供了一系列工具来帮助开发者构建分布式系统,其中 OpenFeign 是一个轻量级的 HTTP 客户端,它简化了 Web 服务客户端的开发。本文将介绍如何在 Spring Cloud 应用…

IC验证面试中常问知识点总结(五)附带详细回答!!!

13、phase相关 13.1 phase列表及分类 task phase: 耗费仿真时间,如run phase;给DUT施加激励、监测DUT的输出都是在这些phase中完成的。 function phase:如build_phase、connect_phase等,这些phase都不耗费仿真时间。 13.2 为什么引入动态运行phase(12个小phase)? 为了…

RISC-V笔记——显式同步

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Explicit Synchronization(显示同步)。 2. 显示同步 显示同步指的是&#xff1a…

pandas在数据清洗中的实际应用

使用 pandas 进行数据清洗 一、引言 在当今数据驱动的时代,数据已成为企业和研究机构做出明智决策的核心要素。然而,原始数据往往充满了噪音、缺失值、重复值和异常值等问题。如果不对这些问题进行处理,可能会导致分析结果的偏差&#xff0…

Git基础-配置http链接的免密登录

问题描述 当我们在使用 git pull 或者 git push 进行代码拉取或代码提交时, 若我们的远程代码仓库是 http协议的链接时,就是就会提示我们进行账号密码的登录。 每次都要登录,这未免有些麻烦。 本文介绍一下免密登录的配置。解决方案 1 执行…

apache pulsar 安装最新版本, docker安装pulsar3.3.2

1. 官网地址: Run a standalone Pulsar cluster in Docker | Apache Pulsar 2. 下载镜像: 2.1 选择镜像版本: https://hub.docker.com/r/apachepulsar/pulsar/tags 2.2 版本3.3.2 docker pull apachepulsar/pulsar:3.3.2 3. 安装&#xff…

【Golang】Go语言中的反射原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析

目录 写在前面 1. 什么是 dynamic 类型? 示例 2. dynamic 与其他类型的转换 2.1 强制类型转换 示例 2.2 使用 is 操作符 示例 2.3 从 List 转换 示例 3. dynamic 类型的最佳实践 3.1 避免过度使用 dynamic 3.2 使用 Null Safety 示例 3.3 异常处理 示…