Mysql 存储富文本的Text字段转成普通字段的一种解决方法

问题出现的情景:
店铺信息表中有几个店铺介绍相关存储富文本的字段,最初店铺数据量少时是用的Text字段,后来数据量增长导致DBA要求取消Text类型改为普通字符类型存储。
问题是如果直接把Text改成varchar类型的话,会直接报错导致类型变更失败。因为mysql5.0以上版本要求,单条数据所有普通类型(不含Text blob等类型)字段长度最大为65535字节,如果按照中文按三个字节算则最多存储65535/3个汉字。因为之前线上该text字段已经存储了信息,所有text字段数据加起来已经有超过了两万字,所以没有办法直接把text转成varchar类型。
故产生此问题。
因为该text字段存储的是富文本信息,故其中有很多重复的经过转义的html标签,且在数据库中该字段不会进行where查询,所以产生了 一种解决方案:把字段压缩后再存储来满足数据库对于长度的限制。
过程如下

  1. 把这个t_shop表备份到备份表 t_shop2
  2. 然后清空t_shop2表的text字段数据
  3. t_shop2的text类型改为varbinary类型
  4. 把清空的数据从t_shop 中读出压缩并写入t_shop2中
  5. 成功后t_shop更名为t_shop_dump, t_shop2更名为t_shop
  6. 上线项目,项目中sql对于富文本字段读取时增加uncompress,存储是进行compress

经测试原来长度20000的富文本压缩后只有1.7k,即不到两千字节,可以较为轻松的解决这个技术需求。

这么处理有三个优点:

  1. 因为进行了压缩,可以在65535的限制内存入数据,而富文本的内容特性也使得对它进行压缩会产生很大的收益效果。
  2. 而为什么要用varbinary来保存压缩后的字段,因为压缩后数据是byte字节数组,不能使用varchar类型存储。
  3. 原始数据没有变动存在了备份表中,以防上线出现问题及时回退。

需要注意的就是对于varbinary存储的压缩的中文数据,解压缩后需要强制转换成char不然可能会乱码,cast(uncompress(shop_info) as char)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值