【开发踩坑】 MySQL不支持特殊字符(表情)插入问题

背景

在这里插入图片描述
线上功能报错:

Cause:java.sql.SQLException:Incorrect string value:'xFO\x9F\x9FxBO'
for column 'comment'at row 1 uncategorized SQLException;
SQL state [HY000]:error code [1366]

排查

初步觉得是编码问题(utf8 — utf8mb4)
参考上个踩坑:
生僻字插入MySQL失败
找到插入的字符:

🟰

这个字符一看就很优秀啊
先去复现一下
but:
dba协助排查、测试:特殊字符插入都是成功的:
在这里插入图片描述
这里留意配置:

  • 数据库版本:5.7
  • connector版本:6.0.6
  • 数据库设置:utf8

再看这个字符空间:
在这里插入图片描述
字符占用4字节,老的utf8是不支持的,只有mb4才支持
所以问题变成了,为什么这里的设置失效了;
服务器的配置本身就是 utf8mb4,所以是没问题的;那么问题多半出在客户端:
所以现在就是连接池版本问题:
connector版本:6.0.6

解决

被ChatGPT科普:
有的数据库连接版本是不支持utf8mb4的:
参考:https://zhuanlan.zhihu.com/p/351071361?utm_id=0
最终解决方案:
升级mysql-connector-java的版本到:
8.0.13

修复

test验证:插入成功

复盘

首先根据

  • mysql版本(一般查看对应的表和字段,只要其支持utf8mb4字符集的话,那么就要看客户端的版本了)
  • Java版本
    选择对应的
  • mysql-connector-java 版本
    之后根据
  • mysql-connector-java版本
    选择对应的解决方案
<think>好的,用户想了解如何使用PyCharm和Python代码示例将数据插入MySQL。我需要先理清步骤,确保回答结构清晰,符合用户的需求。 首先,用户可能已经安装了PyCharm,但不确定是否需要额外配置。所以第一步应该是安装必要的库,比如MySQL Connector/Python。需要提到使用pip安装,并确认Python环境是否正确。 接下来,建立数据库连接是关键。需要给出示例代码,展示如何用connect()方法连接MySQL,包括主机、用户、密码、数据库名等参数。这里要提醒用户替换成自己的实际信息,并处理可能的异常,比如try-except块,避免连接失败导致程序崩溃。 然后,创建数据表。用户可能已经有现成的表,但如果没有,需要提供创建表的SQL语句示例。比如创建一个简单的用户表,包含id、username和email字段。同时,执行SQL语句需要使用游标对象,执行后记得提交更改。 插入数据部分,用户需要具体的代码示例。应该展示如何使用INSERT语句,参数化查询防止SQL注入,比如用占位符%s。同时,说明单条插入和批量插入的区别,以及提交事务的重要性,即conn.commit()。 关闭连接也不能忘记,释放资源是良好的编程习惯,需要提醒用户最后关闭游标和连接。 另外,结合用户提供的引用内容,引用[1]提到删除空格导致语法错误,所以在编写SQL语句时要注意格式,比如字符串中的引号是否正确。引用[4]提到需要知道表名和SQL知识,以及二进制数据的处理,但本例中没有涉及文件插入,所以可能不需要这部分,但可以强调了解表结构的重要性。 可能用户遇到的常见问题包括连接参数错误、SQL语法错误(如引号不匹配)、未提交事务导致数据未保存,以及字符编码问题。这些需要在注意事项中提及,帮助用户避免。 最后,生成相关问题,帮助用户深入学习,比如处理CSV导入、防止SQL注入、事务管理和查询数据。这些问题扩展了用户的应用场景,符合用户可能的下一个需求。 整体结构需要分步骤,代码示例清晰,注意事项突出常见错误,确保用户能顺利实现数据插入功能。</think>### 分步解答:使用PyCharm将数据插入MySQL的Python代码示例 #### 步骤1:安装MySQL驱动 在PyCharm的终端中运行以下命令安装`mysql-connector-python`: ```bash pip install mysql-connector-python ``` #### 步骤2:建立数据库连接 ```python import mysql.connector try: conn = mysql.connector.connect( host="localhost", user="your_username", password="your_password", database="your_database" ) cursor = conn.cursor() print("成功连接MySQL数据库") except mysql.connector.Error as e: print(f"连接失败: {e}") ``` #### 步骤3:创建数据表(可选) 如果目标表不存在,需先创建表: ```python create_table_query = """ CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100) ) """ cursor.execute(create_table_query) conn.commit() # 提交表结构变更[^4] ``` #### 步骤4:插入单条数据 ```python insert_query = "INSERT INTO users (username, email) VALUES (%s, %s)" data = ("john_doe", "john@example.com") try: cursor.execute(insert_query, data) conn.commit() # 必须提交事务[^4] print("插入成功,影响行数:", cursor.rowcount) except mysql.connector.Error as e: print(f"插入失败: {e}") conn.rollback() # 回滚事务 ``` #### 步骤5:批量插入数据 ```python batch_data = [ ("alice", "alice@example.com"), ("bob", "bob@example.com"), ("charlie", "charlie@example.com") ] try: cursor.executemany(insert_query, batch_data) conn.commit() print("批量插入成功,影响行数:", cursor.rowcount) except mysql.connector.Error as e: print(f"批量插入失败: {e}") conn.rollback() # 关闭连接 cursor.close() conn.close() ``` #### 关键注意事项 1. **参数化查询**:始终使用`%s`占位符防止SQL注入 2. **事务提交**:执行DML语句后必须调用`conn.commit()` 3. **错误处理**:建议使用`try-except`块捕获`mysql.connector.Error` 4. **连接配置**:确保host/user/password与MySQL服务器配置一致 5. **数据类型匹配**:插入值类型需与表字段定义匹配[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值