mysql SQL Error: 1366, SQLState: HY

本文详细阐述了在数据库中遇到字符集不匹配问题时,导致测试过程中出现bug的原因,并提供了从数据库到配置文件的一系列解决步骤。通过修改字符集和配置,有效地解决了测试过程中因字符集不兼容导致的问题。
部署运行你感兴趣的模型镜像

人生最痛苦的事就是当你测试没BUG的时候 领导测试出bug了,然后你就得老老实实加班把这个BUG消灭掉,一直加班到凌晨两点也是醉了!这个问题一般会出现在所插入的列中出现了你当前数据库表字段设置的字符集不匹配的问题,这个时候你需要做的就是把mysql字符集往更高兼容的字符集上设置。我碰到的问题是昵称中带了emoji表情,虽然mysql的编码是UTF-8,但明显面对这种四个字节的emoji转义字符存储时还是报错了,解决办法就是把你的字符集全部修改成UTF8mb4(这个字符集是从mysql5.5.3开始支持的,所以如果你的mysql版本低于这个的话要么老老实实升级,要么你就自己在程序里过滤掉这种字符),不管是数据库还是数据表还有数据列都得修改为这个编码(如果是老数据库你就一个个改吧,如果是新建数据库删了重建也是不错的主意,新建数据库的时候记得选择COLLATE即排序规则为utf8mb4_bin或者utf8mb4_unicode_ci),你可以用以下命令去修改:

# 对每个数据库:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# 对每一个数据表:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 对每一列:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (不要盲目的复制以上代码,修改数据列的时候你得看数据列的实际类型以及其允许的实际最大长度,上面只是针对数据列是varchar类型的一个例子)

,改完了上面这些还得修改数据库的配置文件,在配置文件中相应位置添加以下配置

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'

重启mysql后,然后在控制台输入

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
,如果显示为以下结果,则说明生效了:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
如果不是那你就用set命令去设置吧,比如我要修改character_set_client的编码,则输入以下命令:
set character_set_client=utf8mb4;
如果你觉得已经万事大吉了,那你就错了,在用mysql driver访问数据库的时候你可能还会出现这个错误,为什么说是可能,因为你可能刚好因为在jdbc url里少加了characterEncoding=UTF-8而逃过一劫,当然这和你用的driver版本也有关系,如果驱动版本大于等于5.1.22就不要加这个,如果不是就加上,当然useUnicode=true最好加在jdbc url里的。

您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

### 解析 MySQL 连接丢失问题 当遇到 `SQLSTATE[HY000]: General error: 2006 MySQL server has gone away` 错误时,这通常意味着 PHP 和 MySQL 之间的连接意外中断。此错误可以由多种因素引起,包括但不限于超时设置不当、网络配置不正确以及查询执行时间过长等问题。 #### 超时参数调整 为了防止因长时间运行的查询而导致的连接关闭,在 MySQL 配置文件 (`my.cnf`) 中增加以下两个变量可以帮助缓解该问题: ```ini wait_timeout = 28800 interactive_timeout = 28800 ``` 上述命令分别设置了交互式会话和非交互式会话的最大空闲时间为 8 小时[^4]。 #### 数据库连接池优化 对于频繁访问的应用程序来说,采用持久化连接或引入连接池机制能够有效减少重新建立连接所带来的性能损耗。在 Laravel 或者其他支持此类特性的框架内可以通过修改 `.env` 文件来启用持久化连接功能: ```bash DB_PERSISTENT=true ``` 此外,还可以考虑部署专门用于管理数据库连接的服务组件,比如 PGBouncer 对于 PostgreSQL, ProxySQL 则适用于 MySQL 环境下[^1]。 #### 查询语句优化 如果应用程序发送给 MySQL 的请求过于复杂或者涉及大量数据传输,则可能会触发服务器端的安全措施从而切断链接。因此建议审查并简化那些耗时较长的操作,分批次提交大批量的数据更新任务,并确保所有表结构都已创建合适的索引来加速检索过程。 #### 日志分析与监控工具集成 定期查看 MySQL 的慢查询日志和其他诊断信息有助于提前发现潜在的风险点。同时借助像 Prometheus + Grafana 组合这样的开源平台实现对整个系统的实时监测也十分必要,以便及时响应异常状况的发生[^2]。 ```sql SHOW VARIABLES LIKE 'slow_query_log%'; SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2; -- 设置超过两秒即记录为慢查询 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值