第26期 MySQL区分大小写

MySQL 数据库 中,大小写敏感性可能会影响到数据库的操作和管理。了解如何设置不区分大小写对于开发者和管理员来说至关重要。本文将指导您如何在不同环境中配置MySQL以实现大小写不敏感。

MySQL大小写涉及到两个方面:

1、 MySQL的表名、列名以及数据库名的大小写,参数 lower_case_table_names

2、对于存储的数据内容(即表中的数据),这取决于所使用的字符集和排序规则。

关于 MySQL的表名、列名以及数据库名的大小写的设置

参数lower_case_table_names 是一个 MySQL 配置选项,它决定了 MySQL 数据库 中表名和数据库名的大小写敏感性。这个选项有三种可能的取值:0、1 和 2。下面是它们的含义:

    0:这是默认值。在这种情况下,表名和数据库名是区分大小写的。这意味着 MyTablemytable 是两个不同的表名。

    1:这个值表示表名和数据库名将被存储为小写,并且比较时也会被转换为小写。这样, MyTablemytable 将被视为相同的表名。

    2:这个值在 Windows 系统上不可用,并且在其他系统上会被忽略。它的行为类似于 1,不同之处在于 文件系统不会被要求区分大小写。

关于存储的数据内容(即表中的数据)大小写设置

如果你想让MySQL在存储和检索数据时区分大小写,可以通过以下步骤实现:

  1. 选择合适的字符集:确保数据库、表或列使用的字符集支持大小写敏感。例如, utf8mb4_bin是一个区分大小写的字符集。
  2. 设置排序规则:排序规则(Collation)决定了如何比较和排序字符。选择一个区分大小写的排序规则,如 utf8mb4_bin
  3. 修改数据库、表或列的字符集和排序规则:可以使用 ALTER DATABASEALTER TABLEALTER COLUMN语句来修改相应的字符集和排序规则。
  4. 使用binary关键字:可以使用binary关键字来强制区分大小写。
-- 修改数据库的字符集和排序规则
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 修改表的字符集和排序规则
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 修改列的字符集和排序规则
ALTER TABLE mytable MODIFY mycolumn VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

举一个详细的示例

CREATE TABLE `bank` (
  `bank_id` int(11) NOT NULL AUTO_INCREMENT,
  `bank_code` varchar(20) DEFAULT NULL,
  `bank_name` varchar(20) NOT NULL COMMENT '银行名称',
  `locale` varchar(10) DEFAULT 'zh_CN',
  `is_deleted` char(1) DEFAULT 'n',
  `create_user` int(11) DEFAULT NULL,
  `update_date` datetime DEFAULT NULL,
  `update_user` int(11) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`bank_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='银行信息';
INSERT INTO `bank` (`bank_id`, `bank_code`, `bank_name`, `locale`, `is_deleted`, `create_user`, `update_date`, `update_user`, `create_date`) VALUES (195, 'hn', '湖南银行', 'zh_CN', 'n', NULL, '2025-01-01 15:40:27', NULL, '2025-01-01 15:40:27');
INSERT INTO `bank` (`bank_id`, `bank_code`, `bank_name`, `locale`, `is_deleted`, `create_user`, `update_date`, `update_user`, `create_date`) VALUES (196, 'HN', '湖南银行', 'zh_CN', 'n', NULL, '2025-01-01 15:40:27', NULL, '2025-01-01 15:40:27');
select * from bank where bank_code='hn';
select * from bank where bank_code='HN';

因此,MySQL默认是不会对字段的值区分大小写的。所以我们就要用到 binary关键字来强制区分大小写。


binary使用时只需在查询的条件前面加上它就可以。看例子:

select * from bank where binary bank_code='hn';
select * from bank where binary bank_code='HN';


修改表的字符集和排序规则 

ALTER TABLE bank MODIFY bank_code VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_bin;
select * from bank where  bank_code='hn';
select * from bank where  bank_code='HN';


请使用浏览器的分享功能分享到微信等