LZ-string压缩结果写入MySQL乱码问题求助(MEDIUMTEXT UTF8bin)
LZ-string压缩结果的MySQL存储方案及写入乱码解决
一、存储类型的选择
LZ-string的压缩输出分两种情况,对应不同的MySQL类型:
- 如果输出是Unicode编码的可打印字符串(就像你给出的示例:
㊁炆ౠ혏恮ᎀ찃挃뤀):推荐使用MEDIUMTEXT,但必须搭配**utf8mb4字符集**(MySQL原生的utf8其实是utf8mb3,只支持Unicode基础平面字符,无法覆盖LZ-string生成的部分特殊字符)。 - 如果输出是二进制数据(比如LZ-string的
compressToUint8Array方法结果):更推荐二进制类型,比如MEDIUMBLOB(支持最大16MB数据,足够大部分场景)。二进制类型直接存储原始字节,完全避免编码转换的坑。
二、解决写入后数据变全问号的问题
你遇到的全问号问题,核心是字符集不兼容导致无法识别的字符被替换,因为你当前用的UTF8bin是MySQL的utf8mb3字符集,无法容纳LZ-string生成的全部Unicode字符。按以下步骤解决:
修改数据库字段的字符集配置
把目标字段的字符集改成utf8mb4,排序规则可选utf8mb4_bin(和你原来的UTF8bin逻辑一致)。执行SQL:ALTER TABLE 你的表名 MODIFY COLUMN 你的字段名 MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;👉 注意:操作前请备份数据,避免意外丢失。
修正ASP.NET Core的数据库连接字符串
在连接字符串中明确指定字符集为utf8mb4,确保驱动和数据库通信时用正确编码传输。示例:Server=你的服务器地址;Database=你的数据库名;Uid=用户名;Pwd=密码;CharSet=utf8mb4;确保请求传输的编码正确
前端通过POST发送压缩数据时,要保证请求的Content-Type是application/json; charset=utf-8;后端ASP.NET Core使用[FromBody]绑定模型时,默认会正确解析UTF-8编码的内容,不需要额外配置,但如果是手动读取请求流,要指定编码为UTF8。备选方案:切换到二进制类型存储
如果你不想折腾字符集,直接把字段改成MEDIUMBLOB,在代码中把压缩后的字符串转成UTF-8字节数组再存入数据库,读取时再转回字符串解压。这种方式完全绕开编码问题,适合对性能或兼容性要求高的场景。
内容的提问来源于stack exchange,提问作者Demir Agovic
相关产品推荐
相关产品推荐

