以下便是 MySQL 中最为常见且容易踩中的 8 个坑,了解它们能帮助我们更高效、稳定地使用这一强大的数据库系统。 一、字符编码不一致导致乱码 MySQL 的字符编码设置是个精细活儿。 例如,服务器端配置默认字符集为 latin1,而客户端连接时使用 utf8,当插入中文等特殊字符数据后,读取出来就变成了乱码。这是因为数据存储与读取的编码转换出现了错位。 在 my.cnf(Linux 下 MySQL 配置文件)或者 my.ini(Windows 环境)里,将 [mysqld] 段下的 character-set-server 设置为期望的编码(如 utf8mb4 )、表(CREATE TABLE table_name (col_name VARCHAR(255) CHARACTER SET utf8mb4))时也指定相同编码。 总之,在 MySQL 开发运维中,避开这些“坑”需要我们对数据库原理、配置细节、SQL 编写技巧深入钻研,从编码规范、性能优化、数据一致性保障多维度考量,才能让 MySQL 稳定高效支撑业务运转。
: 手把手教大家搭建 MySQL 主从复制 不过那一次是基于 MySQL5.7 搭建的,最近工作需要,搭建了基于 MySQL8 的主从,和 MySQL5.7 的搭建还是有一些不同,于是稍微记录下。 ❝注意,在 MySQL8 里边,这块有一些变化。 MySQL8 中用户创建和授权需要分开,不能像上面那样一步到位,具体方式如下: CREATE USER `rep1`@`192.168.248.139` IDENTIFIED WITH caching_sha2 注意,由于 MySQL8 密码插件的问题,这个问题同样会给主从配置带来问题,所以在 MySQL8 配置主从上,上面这行命令需要添加 get_master_public_key=1,完整命令如下: change 总结 本文主要和大伙说了 MySQL 主从环境搭建,并且提醒了关于 MySQL8 主从搭建时需要注意的几个问题,这几个步骤松哥反反复复操作过很多遍,小伙伴只要按照松哥的步骤一般来说都能成功,有问题欢迎留言讨论
Mycat 目前还未全面支持MySQL 8以上的版本,可能会导致一些问题,例如Mycat连接MySQL 8时可能会报密码错误,因为新版的密码加密方式与旧版不一样。 因此,我们需要更改Mycat的一些配置,让其能正常连接MySQL 8.x。 下载8.x版本的驱动 首先需要下载8.x版本的驱动,Mycat 默认的MySQL驱动版本为5.x。 [root@txy-server /usr/local/mycat]# 在测试能否正常连接 Mycat 时又遇到了另一个问题,使用MySQL 8.x的客户端工具连接 Mycat 报了个密码错误: [ for user 'root', because password is error [root@txy-server ~]# 同样,这也是因为MySQL 8以上的版本与之前版本的密码加密方式不一样 而 Mycat 目前还是只支持5.x版本的加密方式,所以使用8以上版本的MySQL客户端工具连接Mycat时就会报密码错误。 解决方式主要有两种,一是指定mysql客户端连接时的加密方式。
最近由于业务要求,需要在服务器添加一个mysql实例,遇到个坑,分享下 安装mysql不必多说了,多实例肯定是下载二进制包安装,这个网上很多教程,我就不罗嗦了 正常安装mysql实例,在解压的二进制包里面 它里面会带有一些推荐的配置文件和启动脚本,单实例mysql.server,多实例mysqld_multi.server,通过修改basedir和datadir,就可以用这两个脚本来管理mysql服务 正常情况下 读取配置文件和启动的一些原理整理如下: MySQL读取配置文件的顺序是: /etc/my.cnf > /etc/mysql/my.cnf > /usr/etc/my.cnf > ~/.my.cnf 这个顺序可以通过命令来验证 /mysqld start这样的方式启动的时候,其实是使用了mysql.server这个脚本,这个脚本默认会调用mysqld_safe来启动mysqld,所以通常我们启动mysql之后查看进程的时候会发现有 接着通过分析启动脚本看下MySQL启动原理 默认的mysql的服务启动程序是mysql.server,就是我上面说得那个目录下,mysql.server程序主要是会用到两个程序和一个函数,分别是my_print_defaults
设置了mysqld下的配置 [mysqld] lower_case_table_names = 1 lower_case_table_names的官方文档: https://dev.mysql.com/ 服务不是mysqld而是mysql,下面是ubuntu的三种重启方式 # 重启服务 service mysql restart; # 重启系统服务 systemctl restart mysql # 重启 mysql,请确认路径 /etc/init.d/mysql restart 修改后可以用这三个sql查询是否生效 select @@lower_case_table_names; +---------- 翻译过来就是说Linux或者其他类似Unix的系统,不支持设置为2[1],mysql服务端会强制使用0代替 那么这么多表名,一个一个改不是很麻烦? qrtz_triggers; 如果不知道这些表是怎么来的,可以查看这篇quartz 结束后,我们配置的lower_case_table_names = 1即可生效,可以用show tables;检查一下 好坑,
mysql for update 今天遇到一个高并发悲观锁的问题,活跃连接堆积恶性循环最后DB卡死了。做下测试总结。看看这类SQL能扛多少,以后遇到问题心里也有底了。 20) NOT NULL, PRIMARY KEY (`id`), KEY(`c1`), KEY(`c2`,`c3`,`c6`), KEY(`c4`,`c5`) ); mysql | | 7 | 5Loyoa | 32 | 2020-02-15 16:07:20 | 62 | hVC8 | HSb5LnsZ | | 8 | q0AKPK | 92 | 2020-02-15 tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 2 row lock(s) MySQL thread id tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 3 row lock(s) MySQL thread id
希望大家可以少踩坑。 下面开始将架构重组遇到的坑(编译器是IDEA): 坑1:函数注解@Override爆红@Override is not allowed when implementing interface method 坑4:org.apache.ibatis.annotations.Mapper包依赖不了 ? 解决办法:去掉org.mybatis依赖 ? 坑5:redis配置文件一直不生效 解决办法:application.yml格式对齐 ? 坑6:因为引用数据库相关的依赖,结果没有进行相关配置,启动报错。 坑8:各个项目之间的依赖写错,导致循环依赖。 解决办法:将maven项目进行层级依赖,将关系写明白。 ? 其它更多的坑。。。。。。。。未完待续
导读:MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。 在 MySQL 5.6 之前,MySQL 的 DDL 操作会按照原来的表复制一份,并做相应的修改。 因此,MySQL 5.6 增加了 Online DDL,允许在不中断数据库服务的情况下进行 DDL 操作。 用法 ? 另外也可以设置 ALGORITHEM=DAFAULT,让 MySQL 以尽量保证 DML 并发操作的原则选择执行方式。 踩坑 前面提到 Online DDL 执行过程中需要获取 MDL,MDL (metadata lock) 是 MySQL 5.5 引入的表级锁,在访问一个表的时候会被自动加上,以保证读写的正确性。
希望我能说说我在数据库表设计时踩过的坑。那么,我们今天就来聊聊我在数据库表设计时踩过的坑,以及现在对数据库表设计的一点建议。希望能够帮助到你。 你可能觉得你不可能发生这样的错误,说出来也不怕你笑话,我就踩过好几次这样的坑,到最后发现慢SQL了,才发现自己中了这样的坑!!! 索引怎么加,索引重不重要,可以查看《写会MySQL索引》一文进行查看!唉,我就吃过不少没加索引或忘记添加索引的亏,记忆犹新!!! 小结 以上是我数据库设计表时躺过的坑,下面小结精简版本一下: 允许保存表情的表,存储格式设计为utf8mb4,避免使用utf8。 选择合适的数据类型。 上面是我数据库表设计时,遇到踩过坑以后的经验之谈。有些坑当时还真花了不少时间来填补。记录在这里,如果能帮助到你,那就太好了!
本文也是作者实际踩坑后结合实际案例,深入剖析 datetime 类型的精度问题,并提供解决方案和最佳实践。 1.2 四舍五入与进位问题 当插入的毫秒值超过 0.5 秒时,MySQL 会自动进位。 二、问题根源分析 2.1 MySQL 版本差异 MySQL 5.6.4 之前:datetime 类型不支持毫秒精度,插入值的小数部分会被直接丢弃或四舍五入。 (3) -- 精确到毫秒 ); 2.2 客户端工具的显示误导 某些常用的客户端工具(如 Navicat)在设计表时默认将 datetime 的精度默认设置为 0,稍不注意就会踩坑。 在跨数据库迁移(如 MySQL 到 TiDB)时,若未统一时区设置,可能导致时间解析错误。
导读:MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。 在 MySQL 5.6 之前,MySQL 的 DDL 操作会按照原来的表复制一份,并做相应的修改。 因此,MySQL 5.6 增加了 Online DDL,允许在不中断数据库服务的情况下进行 DDL 操作。 另外也可以设置 ALGORITHEM=DAFAULT,让 MySQL 以尽量保证 DML 并发操作的原则选择执行方式。 踩坑 前面提到 Online DDL 执行过程中需要获取 MDL,MDL (metadata lock) 是 MySQL 5.5 引入的表级锁,在访问一个表的时候会被自动加上,以保证读写的正确性。
踩坑经验 | Mysql导入emoji报错 上周遇到了中文长度的问题之后,就想起了很久之前遇到的这个问题,也是一个和长度相关的问题。 LEARN MORE 图片由360鸿图绘制 还是老规矩,周日不定期更新的踩坑系列。还是先介绍一下遇到这个问题的业务场景,因为时间比较久远了,很多细节已经想不起来了。 mysql默认使用的的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是emoji表情是4个字节,所以存储不了。因此,有表情的字段上就有将该字段设置为utf8mb4。 根据各种资料收集的结果来看,不同版本的mysql对于设置这里是有细微的区别的。 数据处理技术分享、代码分享 周三:工作效率提升工具/技巧,办公自动化等 周四:读书笔记系列,分享读书心得和要点 周五:聊聊职场,包括但不限于求职面试 周六:随缘分享,内容不确定 周日:随缘分享一些技术踩坑经验
文章目录 写在前面 mysqli扩展 MySQL权限 测试 写在前面 ---- 版本迭代,网上很多解决方法都失效了,在此记录一下。 扩展(可以自己打补丁 ),而是推荐使用mysqli扩展和pdo_mysql。 $link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; exit; } echo "Success: A proper connection to MySQL was made! > 至此PHP就成功连接MySQL了o(* ̄▽ ̄*)o,mysqli相关用法可查官方文档。
pretty-printed XML string for the Element. """ rough_string = ElementTree.tostring(elem, 'utf-8' @echo off TITLE 小米8 一键刷入 Recovery工具 color 3f mode con cols=90 lines=29 echo. 小米8 一键刷入 TWRP Recovery工具 by yunswj echo. echo. echo. echo --按任意键继续 echo.
那么,MySQL 索引到底在哪些场景下会失效呢? 我结合自己踩过的坑,总结了一些典型的案例。下面就一一展开。 3 隐式类型转换这个坑特别隐蔽,尤其是在 字符串和数字比较 时。 8 排序和不同字符集有时查询本身没问题,但一旦加上排序,索引就失效了。尤其是当 ORDER BY 的字段和索引字段顺序不一致 时。 因为 MySQL 觉得直接扫一遍比走索引还快。这种情况不是 bug,而是优化器的“聪明决定”。10 强制索引与执行计划有些时候 MySQL 的优化器并不聪明,选错了索引。 总结索引是 MySQL 提升性能的利器,但稍不注意,它就可能失效。
踩坑了啊,又踩坑了啊! 这次踩到一个特别无语的常识坑。知道真相的那一刻,人就是整个麻掉。
分享下docker部署mysql8.0踩坑经历 在一次项目中想用docker部署mysql8.0出现了这种问题 数据库是有这个表的,但是项目使用的时候,就出现了这样的问题,因为编码中大写,导致请求到mysql 这是docker部署mysql的一个坑, 这里给大家提供一个标准的docker部署mysql8.0的正确流程。 解决了大小写敏感问题 还踩坑你打我 #opt目录是Linux提供我们扩展的目录,可以存放用户需求的文件 mkdir -p /opt/datas/docker/mysql/conf mkdir -p /opt mysql/mysqld.sock default-character-set = utf8mb4 [mysqld] #pid-file = /var/run/mysqld/mysqld.pid = utf8mb4 collation_server = utf8mb4_bin secure-file-priv= NULL # Disabling symbolic-links is recommended
PRIMARY KEY (`id`), KEY `idx_uid_stat` (`uid`,`order_status`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 order by id asc limit 1 可以看到它的 possible_keys(此 SQL 可能涉及到的索引) 是 idx_uid_stat,但实际上(key)用的却是全表扫描 我们知道 MySQL 为了查看 MySQL 优化器为啥选择了全表扫描,我打开了 optimizer_trace 来一探究竟 画外音:在MySQL 5.6 及之后的版本中,我们可以使用 optimizer trace 功能查看优化器生成执行计划的整个过程 这个 bug 最早追溯到 2014 年,不少人都呼吁官方及时修正这个bug,可能是实现比较困难,直到 MySQL 5.7,8.0 都还没解决,所以在官方修复前我们要尽量避免这种写法,如果一定要用这种写法 SQL 虽然是按 id 排序的,但在 id 上作了加法这样耗时的操作(虽然只是加个无用的 0,但足以骗过优化器),优化器认为此时基于全表扫描会更耗性能,于是会选择基于成本大小的方式来选择索引 巨人的肩膀 mysql
在我们日常工作中,可能会经常使用MySQL数据库,因为它是开源免费的,而且性能还不错。 在国内的很多公司中,经常被使用。 但我们在MySQL使用过程中,也非常容易踩坑,不信继续往下看。 今天这篇文章重点跟大家一起聊一聊使用 MySQL 的15个坑,希望对你会有所帮助。 7 字符集设置不当 有些小伙伴,喜欢将MySQL的字符集设置成utf8。 我几年之前也喜欢这干。 但后面出现问题了,比如在用户评价输入框中,用户输入了表情符合,可能会直接导致程序保存。 使用最多的是 utf8mb4_general_ci(默认的)和 utf8mb4_bin。 在MySQL中只保存最新的数据,历史数据可以迁移到归档库中。
mediumtext NOT NULL COMMENT '回复内容', UNIQUE KEY `idx_id` (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 最近有同事反馈一些用户在查看个人回复时,部分页取不到数据,原因是一些SQL直连Mysql有返回结果,而通过Atlas返回空,SQL如下: SELECT * FROM post_reply WHERE `