mysql索引忽略字段内容的大小写

在MySQL中,varchar字段建立的唯一索引默认可能不区分大小写,这取决于字段的排序规则。如utf8mb4_0900_ai_ci是不区分大小写的,而utf8mb4_bin则区分。若需区分大小写,可使用如utf8mb4_0900_as_cs。

最近负责的一个项目,varchar字段需要建唯一索引,发现建的唯一索引没有区分大小写,最后经过研究解决这一问题,在此记录。

其实这个问题取决于索引字段的排序规则-如果是排序规则是ci 就不会区分大小写,如果排序规则是cs就会区分大小写。

常见排序规则:

MySQL 8.0.1 及更高版本中默认排序规则为utf8mb4_0900_ai_ci

utf8mb4_unicode_ci
是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
utf8mb4_general_ci
是一个遗留的 校对规则,不支持扩展,它仅能够在字符之间进行逐个比较。utf8_general_ci校对规则进行的比较速度很快,但是与使用 utf8mb4_unicode_ci的校对规则相比,比较正确性较差。
utf8mb4_bin
将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
utf8mb4_0900_ai_ci
MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:
uft8mb4 表示用 UTF-8 编码方案,每个字符最多占 4 个字节。
0900 指的是 Unicode 校对算法版本。(Unicode 归类算法是用于比较符合 Unicode 标准要求的两个 Unicode 字符串的方法)。
ai 指的是口音不敏感。也就是说,排序时 e,è,é,ê 和 ë 之间没有区别。
ci 表示不区分大小写。也就是说,排序时 p 和 P 之间没有区别。


由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。如果需要重音灵敏度和区分大小写,则可以使用 utf8mb4_0900_as_cs 代替。

要修改 MySQL 数据表中字段的大小,可以使用 `ALTER TABLE` 语句结合 `MODIFY COLUMN` 子句实现。该操作会重新定义字段的属性,包括数据类型和长度。需要注意的是,修改字段可能触发表的重建,导致执行时间较长[^1]。 例如,若字段原类型为 `VARCHAR(50)`,现需修改为 `VARCHAR(100)`,可以使用如下语句: ```sql ALTER TABLE your_table_name MODIFY COLUMN column_name VARCHAR(100); ``` 在执行此操作前,请注意以下几点: - **数据丢失风险**:修改字段类型或长度时,若新定义的数据类型与原数据不兼容,可能导致数据丢失或转换异常。例如将 `VARCHAR(100)` 修改为 `CHAR(10)`,超出长度限制的数据会被截断。 - **性能影响**:`MODIFY COLUMN` 通常会导致表重建,尤其是在大表上执行时,可能会影响数据库性能。根据实际测试,修改字段操作在 200 万行数据的表上耗时约 13 秒。 - **索引与约束影响**:如果字段上有索引或约束,修改字段类型后需验证索引是否仍然有效,必要时需重建索引。 ### 在线修改建议 为了避免长时间锁定表,可以使用 **在线 DDL(Online DDL)** 或第三方工具如 **Percona Toolkit** 中的 `pt-online-schema-change` 来减少对生产环境的影响。这些工具可以在不阻塞读写操作的情况下完成表结构变更[^2]。 ### 示例:修改字段大小 假设有一个用户表 `users`,其中字段 `username` 原定义为 `VARCHAR(50)`,需要扩展为 `VARCHAR(150)`,可执行如下语句: ```sql ALTER TABLE users MODIFY COLUMN username VARCHAR(150); ``` 若字段包含默认值、非空约束等,需要在 `MODIFY COLUMN` 语句中重新声明: ```sql ALTER TABLE users MODIFY COLUMN username VARCHAR(150) NOT NULL DEFAULT ''; ``` ### 字段顺序调整 若需要调整字段在表中的位置,可以使用 `CHANGE COLUMN` 子句并指定 `AFTER` 或 `FIRST` 来定义新位置[^3]。例如将字段 `GatewayId` 放置在 `RegionID` 之后: ```sql ALTER TABLE user_movement_log CHANGE GatewayId GatewayId INT NOT NULL DEFAULT 0 AFTER RegionID; ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet-W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值