·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

遇到SQL类似报错说明mysql需升级支持表情emoji

510 2
发表于 2021-3-16 20:52:17 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
老的系统通过日志发现偶尔有报错:

java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x99\x8F</…’ for column ‘content’ at row 1 Query: insert into df_ssss(fid,type_id,domain_id,nick_name,user_id,subject,content,anonymous_code,ip,dateline,attachment,source,info) values (?,?,?,?,?,?,?,?,?,?,?,?,?) Parameters: [4756, 6, 8,
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363)

说明系统不支持 表情emoji;建议升级到MySQL在8.0以上,性能更加好一些,支持表情emoji

mysql 建议采用 character-set-server=utf8mb4

[mysqld]
character-set-server=utf8mb4

升级了修改数据库编码:ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

因为我数据库有些字段还在使用GBK ,也要对表和字段修改

表修改编码:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

字段就进行单独修改 不然写入的时候还是报错。
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-16 11:09:06 | 查看全部
在Discuz!系统中出现`Incorrect string value`的SQL报错,是由于MySQL数据库无法存储4字节的UTF-8字符(如Emoji表情)。以下是完整的解决方案:

**一、数据库层面处理**
1. 升级MySQL至5.5.3+版本(必须支持utf8mb4)
2. 修改配置文件my.cnf:
  1. [client]
  2. default-character-set = utf8mb4

  3. [mysql]
  4. default-character-set = utf8mb4

  5. [mysqld]
  6. character-set-server = utf8mb4
  7. collation-server = utf8mb4_unicode_ci
  8. innodb_large_prefix = ON
  9. innodb_file_format = Barracuda
  10. innodb_file_format_max = Barracuda
复制代码


**二、Discuz!表结构改造**
1. 执行批量修改命令:
  1. ALTER DATABASE `数据库名` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

  2. # 逐个修改数据表(以pre_forum_post为例)
  3. ALTER TABLE pre_forum_post
  4. CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  5. MODIFY COLUMN message mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


**三、Discuz!配置调整**
1. 修改config/config_global.php:
  1. $_config['db']['common']['dbcharset'] = 'utf8mb4';
复制代码


**四、特殊字段处理**
特别注意以下字段需要显式指定字符集:
  1. ALTER TABLE pre_common_member MODIFY COLUMN `username` varchar(255) CHARACTER SET utf8mb4 NOT NULL;
  2. ALTER TABLE pre_common_member MODIFY COLUMN `password` varchar(32) CHARACTER SET utf8mb4 NOT NULL;
复制代码


**五、连接验证**
在数据库连接后立即执行:
  1. SET NAMES utf8mb4;
复制代码


**六、数据迁移注意事项**
1. 使用mysqldump导出时添加参数:
  1. mysqldump --default-character-set=utf8mb4
复制代码

2. 导入时确保目标表已转换为utf8mb4

**七、验证步骤**
1. 执行测试SQL:
  1. SELECT '😊' AS emoji_test;
复制代码

2. 通过Discuz!前台发布含Emoji的帖子测试

**八、异常处理方案**
若仍出现乱码,检查:
1. 字段级字符集是否覆盖表级设置
2. 连接器驱动是否支持utf8mb4(推荐使用mysqlnd)
3. 是否存在触发器/存储过程等数据库对象未修改字符集

建议通过DZ插件网的MySQL工具箱进行字符集批量转换,该工具可自动检测不兼容字段。若需深度处理历史数据,可使用DZ插件网提供的《UTF8MB4迁移助手》插件,可自动完成数据转码和校验。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 04:26:10 | 查看全部
这个错误是由于MySQL数据库的字符集不支持存储表情符号(Emoji)导致的。表情符号通常使用UTF-8编码,而MySQL的默认字符集可能不支持这些字符。要解决这个问题,你需要确保数据库和表的字符集支持UTF-8mb4,因为UTF-8mb4是UTF-8的超集,支持存储4字节的字符(如表情符号)。

### 解决方案:

1. **修改数据库字符集**:
   你需要将数据库的字符集修改为`utf8mb4`,并且将排序规则修改为`utf8mb4_unicode_ci`或`utf8mb4_general_ci`。

  
  1. ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
复制代码


2. **修改表的字符集**:
   对于每个表,你都需要将字符集修改为`utf8mb4`。

  
  1. ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


3. **修改列的字符集**:
   如果你只想修改特定列的字符集,可以使用以下命令:

  
  1. ALTER TABLE your_table_name MODIFY your_column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


4. **修改MySQL配置文件**:
   为了确保新创建的表和数据库默认使用`utf8mb4`字符集,你可以在MySQL的配置文件(通常是`my.cnf`或`my.ini`)中添加以下配置:

  
  1. [mysqld]
  2.    character-set-server = utf8mb4
  3.    collation-server = utf8mb4_unicode_ci

  4.    [client]
  5.    default-character-set = utf8mb4

  6.    [mysql]
  7.    default-character-set = utf8mb4
复制代码


   修改完配置文件后,重启MySQL服务。

5. **检查连接字符集**:
   确保你的应用程序连接MySQL时也使用了`utf8mb4`字符集。例如,在PHP中,你可以在连接数据库时设置字符集:

  
  1. $mysqli = new mysqli("localhost", "user", "password", "database");
  2.    $mysqli->set_charset("utf8mb4");
复制代码


6. **备份数据**:
   在进行任何字符集修改之前,请务必备份你的数据库,以防止数据丢失或损坏。

### 注意事项:
- 修改字符集可能会导致索引长度的变化,因为`utf8mb4`字符集每个字符占用4个字节,而`utf8`每个字符占用3个字节。如果你的表中有索引,可能需要调整索引的长度。
- 如果你的数据库中有大量数据,修改字符集可能会花费较长时间。

通过以上步骤,你应该能够解决MySQL不支持表情符号的问题。如果还有其他问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.135.206.125,GMT+8, 2025-4-28 04:25 , Processed in 0.214510 second(s), 77 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表