当前位置: 首页 > news >正文

MySQL字符集引起的锁表、唯一索引重复问题

唯一索引冲突
在这里插入图片描述

原因:
传入的参数字符集与字段字符集不一致(如参数是 latin1,字段是 utf8mb4),MySQL 可能无法使用索引,转而进行全表扫描
当需要在不同字符集之间进行转换时(如连接查询中两表字段字符集不同),MySQL 会消耗额外资源进行转换,可能导致事务执行时间变长。事务持有锁的时间延长,会增加与其他事务的锁竞争概率,间接引发锁等待或表级锁升级。
在这里插入图片描述

解决:
设置字段字符集

在这里插入图片描述
在创建数据库、表或修改现有表结构时指定字符集

  1. 创建数据库时指定字符集
    当创建新数据库时,你可以在 CREATE DATABASE 语句中指定字符集,例如使用 utf8mb4 字符集:

    CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    
  2. 创建表时指定字符集
    在创建新表时,你可以在 CREATE TABLE 语句中为表和它的字段指定字符集。例如:

    CREATE TABLE mytable (id INT AUTO_INCREMENT,name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    这里,CHARACTER SET utf8mb4 COLLATE utf8mb4_bin 指定了字段的字符集和校对规则。

  3. 修改现有表字段的字符集
    如果你需要修改现有表的字段字符集,可以使用 ALTER TABLE 语句:

    ALTER TABLE mytable MODIFY name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    
  4. 转换整个数据库的字符集
    如果你想转换整个数据库的默认字符集(例如,从 latin1 转换为 utf8mb4),你可以这样做:

    ‌转换表字符集‌:

    -- 当前的字段都会被重新定义为新的字符集和排序规则,从而可能导致数据转换或损失
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    -- 省略 CONVERT TO 只需修改表的默认字符集,不会影响已有字段的字符集和排序规则。只有在将来的字段添加时,新的字段才会采用指定的字符集和排序规则
    ALTER TABLE tablename CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    

    ‌转换数据库默认字符集‌:

    首先,你需要确保所有的表都已经转换。然后,你可以修改数据库的默认字符集:

    ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    

注意事项

  1. 在转换字符集之前,确保你的数据不会因为这种转换而丢失或损坏。特别是当涉及到校对规则(collation)时,某些字符在不同校对规则下可能会有不同的排序或比较行为。
  2. 对于已经存在的数据,使用 CONVERT TO CHARACTER SET 语句可以帮助转换数据,但这通常不改变列的校对规则。如果需要改变校对规则,需要单独指定。
  3. 在高流量的生产环境中进行此类操作前,最好在测试环境中进行充分的测试。
  4. 确保 MySQL 服务器版本支持 utf8mb4 字符集,因为这是从 MySQL 5.5.3 版本开始引入的。使用 SHOW CHARACTER SET; 可以查看支持的字符集列表。
http://www.dtcms.com/a/470116.html

相关文章:

  • 算法6.0
  • 【C 学习】12.1-函数基础
  • 11.程序地址空间_2
  • Java的方法重写/覆盖
  • 门户网站建站要求外国做家具的网站
  • 『 数据库 』MySQL复习(表的约束)
  • 房地产开发公司网站源码做高端网站的公司
  • 【vue】使用web worker上报日志:
  • MySQL 与Power BI 的作用,以及在数据分析中扮演的角色
  • k歌里的相片是通过网站做的吗typecho与Wordpress同步
  • 如何做中英版网站简单写文章的网站
  • Linux 进程通信——基于责任链模式的消息队列
  • 手机能做网站吗北京软件开发公司哪家专业
  • 物流网站的建设免费推广平台排行榜
  • iOS一直讲的单元格优化
  • 信阳网站seo用手机怎么做网站
  • 【Canvas技法】 卡通版太阳的三种画法
  • 词根学习笔记 | Agri系列
  • PHP解决跨域请求问题的两种实用方法
  • 语音大模型自监督训练思路
  • 辉芒微单片机FT60E12X,Touch 系列8位单片机MCU简要分析
  • w3c网站代码标准规范自己做的网站怎么接入网页游戏
  • 一篇文章详细解析 IPv4地址
  • 主办单位性质与网站名称不符绍兴专业做网站公司
  • C++ 简介
  • ValueTuple 详解
  • 框架--MyBatis
  • 1.C++基础(上)
  • cursor一些简单的使用心得官方的建议
  • 新能源汽车公司如何落地 ASPICE