小菜鸟

java菜鸟号正在起航

MySQL 变量详解:系统变量与自定义变量的使用

MySQL 中的变量是存储数据的容器,分为系统变量(MySQL 内置,控制数据库行为)和自定义变量(用户定义,用于查询或存储过程中传递数据)。合理使用变量可简化操作、提升脚本灵活性。本文详细解析两类变量的定义、使用及区别。

系统变量:控制 MySQL 运行行为

系统变量是 MySQL 预定义的变量,用于配置数据库的运行参数(如连接数、缓存大小等),分为全局变量(影响所有会话)和会话变量(仅影响当前会话)。

系统变量的分类与作用

类型 作用范围 生效时机 示例
全局变量 所有会话(连接) 重启 MySQL 或通过 SET GLOBAL 修改后生效 max_connections(最大连接数)
会话变量 当前会话(连接) 会话启动时继承全局变量,SET SESSION 修改后立即生效 autocommit(自动提交开关)

查看系统变量

(1)查看所有系统变量
-- 查看所有全局变量
SHOW GLOBAL VARIABLES;

-- 查看所有会话变量(默认显示当前会话)
SHOW SESSION VARIABLES;  -- 或简写为 SHOW VARIABLES;
(2)过滤查询特定变量

使用 LIKE 匹配变量名(支持通配符 %):

-- 查看所有包含“timeout”的全局变量
SHOW GLOBAL VARIABLES LIKE '%timeout%';

-- 查看当前会话的字符集变量
SHOW SESSION VARIABLES LIKE 'character_set_%';
(3)查询单个变量的值

通过 @@ 符号访问变量:

阅读全文 »

MySQL 视图详解:虚拟表的创建与应用

视图(View)是 MySQL 中一种虚拟存在的表,它不存储实际数据,而是保存查询逻辑,动态生成结果。合理使用视图可以简化复杂查询、提高数据访问的安全性和一致性。本文详细解析视图的概念、操作及适用场景。

视图的核心概念

视图是基于一个或多个表的查询结果构建的虚拟表,具有以下特性:

  • 不存储数据:仅保存 SQL 查询逻辑,每次使用视图时,MySQL 会动态执行查询并返回结果。
  • 结构依赖源表:视图的字段来自定义视图时的 SELECT 语句,源表结构变化可能导致视图失效。
  • 无物理存储:不占用额外存储空间(除视图定义本身),也不能创建索引、触发器或默认值。

视图的应用场景

视图适用于以下场景,帮助简化操作和提升安全性:

  1. 简化复杂查询:将多表关联、聚合计算等复杂查询封装为视图,后续使用时直接查询视图即可。
  2. 重用查询逻辑:多个业务场景需要相同的查询结果时,视图可避免重复编写 SQL。
  3. 限制数据访问:通过视图只暴露部分字段(如隐藏密码、身份证号等敏感信息),保护原始数据。
  4. 统一数据接口:当源表结构变更时,只需修改视图定义,无需修改依赖该视图的应用代码。

视图的基本操作

创建视图

语法

阅读全文 »

MySQL 事务详解:ACID 特性、隔离级别与实践

事务是数据库操作的基本单位,确保一组 SQL 语句要么全部成功执行,要么全部失败回滚,是保证数据一致性的核心机制。MySQL 中仅 InnoDB 存储引擎支持事务,本文详细解析事务的特性、隔离级别及实际应用。

事务的基本概念

事务(Transaction):由一个或多个 SQL 语句组成的执行单元,具备 “原子性”—— 要么所有语句执行成功(提交),要么全部失败(回滚),不存在部分执行的情况。

  • 支持情况:MySQL 中只有 InnoDB 引擎支持事务(MyISAM、MEMORY 等引擎不支持)。
  • 典型场景:转账操作(扣减 A 账户金额 + 增加 B 账户金额,两步必须同时成功或失败)。

事务的 ACID 特性

事务的四大核心特性(ACID)是保证数据可靠性的基础:

特性 含义说明 示例
原子性(Atomicity) 事务是不可分割的最小单位,操作要么全执行,要么全不执行。 转账时,若扣减 A 账户后系统崩溃,B 账户不会增加金额(事务回滚,恢复 A 账户)。
一致性(Consistency) 事务执行前后,数据库从一个一致性状态切换到另一个一致性状态(数据规则不变)。 转账前 A+B 总金额为 1000,转账后总金额仍为 1000(不会多增或少减)。
隔离性(Isolation) 多个事务并发执行时,彼此不干扰,每个事务感觉不到其他事务的存在。 事务 1 查询余额时,事务 2 的转账操作不会影响事务 1 的查询结果(隔离级别决定影响程度)。
持久性(Durability) 事务提交后,对数据的修改永久生效,即使系统崩溃也不会丢失。 事务提交后,数据写入磁盘,重启数据库后修改仍存在。

事务的创建与控制

MySQL 默认开启 “自动提交”(autocommit=ON),即每条 SQL 语句自动作为一个事务提交。如需手动控制事务,需先关闭自动提交。

事务控制的核心语句

阅读全文 »

Java 编程细节:提升代码质量的关键注意事项

在 Java 开发中,一些看似微小的细节往往决定了代码的健壮性、可读性和性能。本文总结了日常编程中容易忽略的关键细节,涵盖方法重写、对象比较、异常处理等核心场景,帮助开发者写出更可靠的代码。

重写 equalshashCode 的注意事项

equalshashCodeObject 类的核心方法,用于对象比较和哈希表操作,重写时需严格遵循规范,否则可能导致集合框架(如 HashMapHashSet)行为异常。

重写 equals 时必须使用 @Override 注解

  • 错误示例:误将参数类型改为具体类(如User),导致实际是重载而非重写。

    // 错误:这是重载(参数类型为 User),而非重写 Object 的 equals
    public boolean equals(User other) { 
        return this.id == other.id;
    }
  • 正确做法:参数类型必须为Object,并添加@Override注解,让编译器校验正确性。

    @Override // 强制编译器检查是否正确重写
    public boolean equals(Object obj) {
        if (this == obj) return true; // 自身比较
        if (obj == null || getClass() != obj.getClass()) return false; // 类型不一致
        User other = (User) obj; // 强制转型
        return this.id == other.id; // 核心比较逻辑
    }

重写 equals 必须同时重写 hashCode

  • 规范要求Object 类文档明确规定:

    若两个对象通过 equals 比较相等,则它们的 hashCode 必须返回相同的值。
    若两个对象 hashCode 不同,则 equals 一定返回 false

  • 后果:若仅重写 equals 而忽略 hashCode,会导致对象在哈希集合(如 HashSet)中无法正确去重,或在 HashMap 中作为键时无法被正确查找。

  • 正确示例

    @Override
    public boolean equals(Object obj) {
        // 省略 equals 实现...
    }
    
    @Override
    public int hashCode() {
        // 确保 equals 相等的对象,hashCode 也相等
        return Objects.hash(id, name); // 推荐使用 Objects.hash 组合字段
    }
  • 最佳实践

    • 参与 equals 比较的字段(如 idname),必须全部纳入 hashCode 计算。
    • 避免使用可变字段作为 hashCode 计算依据(对象修改后哈希值变化,导致集合操作异常)。
阅读全文 »

MySQL 函数大全:从基础操作到高级应用

MySQL 提供了丰富的内置函数,涵盖字符处理、数学计算、日期操作、聚合统计等场景,掌握这些函数能大幅提升查询效率和灵活性。本文按功能分类详解常用函数,包含语法、示例及使用注意事项。

字符函数:处理字符串的核心工具

字符函数用于字符串的拼接、截取、转换等操作,是日常查询中最常用的函数类别。

1. LENGTH(str):获取字符串字节数

  • 作用:返回字符串的字节长度(注意:不同字符集字节数不同,如 UTF8 中一个汉字占 3 字节)。

  • 示例:

    SELECT LENGTH('john');  -- 结果:4(纯英文,每个字符1字节)
    SELECT LENGTH('张三');  -- 结果:6(UTF8 编码,每个汉字3字节)

2. CONCAT(str1, str2, ...)CONCAT_WS(sep, str1, ...):拼接字符串

  • CONCAT:直接拼接多个字符串,若任一参数为 NULL,结果为 NULL

  • CONCAT_WS:以第一个参数为分隔符拼接字符串(WS 即 “With Separator”),忽略 NULL

  • 示例:

阅读全文 »
0%