Mysql-Python-字段压缩

引言

在数据库中,我们经常会用到一种字段类型,那就是 VARCHAR ,这种字段类型很方面,存储字符串可以做到用多少存多少,占用的空间也是随大随小,很方便。但是如果超出了字段设置的长度,那么就会出现 # 数据截断 #,在这里就提供一种方便的字段压缩方式 Glib + Base64

相关代码

# -*- coding: utf-8 -*-
# @Time : 2022/7/8 14:00
# @Author : Zhangzixu
# @Software: PyCharm
# @Description:
import base64
import gzip
import sys
import zlib


class StringFeildDensity:
    def __init__(self):
        pass

    def gzip_zip_base64(self, content):
        """
        Gzip 压缩方法
        字节比 1000(压缩前) : 263.78(压缩后)
        Gzip + Base64 压缩方法
        字节比大约在 1000(源字符串字节) : 353.46(压缩后所占字节)
        Args:
            content: 传入的文本

        Returns:
            Gzip > Bytes
            Gzip + Base64 > String
        """
        print("## 正在使用 Gzip+base64 压缩方法")
        bytes_com = gzip.compress(str(content).encode("utf-8"))
        base64_data = base64.b64encode(bytes_com)
        back_content = str(base64_data.decode())
        print(f"## 源字符串所占字节大小: {sys.getsizeof(content)}, "
              f"压缩后 Gzip 所占字节大小: {sys.getsizeof(bytes_com)}, "
              f"压缩后 Gzip + Base64 所占字节大小: {sys.getsizeof(back_content)}")
        return back_content

    def gzip_unzip_base64(self, content):
        """
        Gzip + Base64 解压方法
        Args:
            content: 传入的文本

        Returns:
            String
        """
        base64_data = base64.b64decode(content)
        bytes_decom = gzip.decompress(base64_data)
        back_content = bytes_decom.decode()
        return back_content

    def zlib_zip(self, content):
        """
        Zlib 压缩方法
        字节比 1000(压缩前) : 261.27(压缩后)
        Zlib + Base64 压缩方法
        字节比 1000(压缩前) : 349.81(压缩后)
        Args:
            content: 传入的文本

        Returns:
            Zlib > Bytes
            Zlib + Base64 > String
        """
        print("## 正在使用 Zlib + Base64 压缩方法")
        bytes_com = zlib.compress(str(content).encode("utf-8"))
        base64_data = base64.b64encode(bytes_com)
        back_content = str(base64_data.decode())
        print(f"## 源字符串所占字节大小: {sys.getsizeof(content)}, "
              f"Zlib 压缩后所占字节大小: {sys.getsizeof(bytes_com)}, "
              f"压缩后 Zlib + Base64 所占字节大小: {sys.getsizeof(back_content)}")
        return back_content

    def unzlib_zip(self, content):
        """
        Zlib 解压方法
        Args:
            content: 传入的文本

        Returns:
            String
        """
        base64_data = base64.b64decode(content)
        bytes_decom = zlib.decompress(base64_data)
        back_content = bytes_decom.decode()
        return back_content

代码测试结果

测试一:

    test_text = """<meta charset=\"utf-8\">\n<div>\n<meta charset=\"utf-8\"> <span></span>\n</div>\n<h4 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">Addon en polymère \"Inima\" couleur à choix, de la collection \"Love\"<br><meta charset=\"utf-8\">\n</h4>\n<h4 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">(photo non contractuelle, seul l'addon est compris dans la commande)</h4>\n<h4 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">\n<br><br>Design : Amila Pousaz<br>\n</h4>\n<div style=\"text-align: center;\"><img src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love5.web_1024x1024.jpg?v=1634294355\" width=\"1024x1024\" height=\"1024x1024\" style=\"float: none;\"></div>\n<div style=\"text-align: center;\"><img style=\"float: none;\" alt=\"\" src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love7.web_1024x1024.jpg?v=1634294371\"></div>\n<h4 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">\n<img alt=\"\" src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love6.web_1024x1024.jpg?v=1634294402\" style=\"float: none;\"><img style=\"float: none;\" alt=\"\" src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love8.web_1024x1024.jpg?v=1634294419\">\n</h4>\n<h1 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">Précautions / informations<br>\n</h1>\n<div class=\"p1\">\n<div style=\"padding-left: 90px;\"></div>\n<p class=\"p1\" style=\"text-align: left; padding-left: 90px;\" data-mce-style=\"text-align: left; padding-left: 90px;\">Nous vous rendons attentifs au fait que la couleur de l'addon et de ses dessins peuvent varier selon la lumière.<br></p>\n<p class=\"p1\" style=\"padding-left: 90px;\" data-mce-fragment=\"1\"><meta charset=\"utf-8\"><span data-mce-fragment=\"1\">Attention, les addons en </span><span class=\"il\" data-mce-fragment=\"1\">polymère</span><span data-mce-fragment=\"1\"> sont sensibles aux produits chimiques, notamment au parfum, solvant, désinfectant pour les mains, acétone ou autre produit similaire ! </span><span data-mce-fragment=\"1\">Dans la réalité, nous nous efforçons, de nous approcher le plus possible de la couleur des addons figurant dans le shop. Cependant, il peut y avoir des légères différences de teinte.<br></span><strong data-mce-fragment=\"1\"> <br>Attention : cet addon n'est pas compatible avec la base extra small (9mm).</strong></p>\n<p class=\"p1\" style=\"text-align: left; padding-left: 90px;\" data-mce-style=\"text-align: left; padding-left: 90px;\"><br> </p>\n</div>\n<h1 style=\"text-align: center;\" data-mce-style=\"text-align: center;\">Notre inspiration<br>\n</h1>\n<div style=\"text-align: center;\">\n<img src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/INIMANOIR_480x480.png?v=1634288122\" width=\"600x600\" height=\"600x600\" style=\"float: none;\" data-mce-fragment=\"1\" data-mce-src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/INIMANOIR_480x480.png?v=1634288122\"><br> <br><img src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/INIMA_480x480.png?v=1634288133\" width=\"600x600\" height=\"600x600\" style=\"float: none;\" data-mce-fragment=\"1\" data-mce-src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/INIMA_480x480.png?v=1634288133\"><br> <br><img src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/image_e080419c-39c6-498f-8be0-24a71bfae4a4_480x480.png?v=1634225677\" width=\"600x600\" height=\"600x600\" style=\"float: none;\" data-mce-fragment=\"1\" data-mce-src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/image_e080419c-39c6-498f-8be0-24a71bfae4a4_480x480.png?v=1634225677\"><br> <br><img src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love17.web_480x480.jpg?v=1634302667\" width=\"600x600\" height=\"600x600\" style=\"float: none;\" data-mce-fragment=\"1\" data-mce-src=\"https://cdn.shopify.com/s/files/1/0798/2303/files/love17.web_480x480.jpg?v=1634302667\"><br>\n</div>\n<div style=\"padding-left: 60px;\" data-mce-style=\"padding-left: 60px;\"></div>\n<h1 style=\"text-align: center;\" data-mce-style=\"text-align: center;\"></h1>\n<div class=\"kc-elm kc-css-330264 kc_col-sm-8 kc_column kc_col-sm-8\">\n<div class=\"kc-col-container\">\n<div class=\"kc-elm kc-css-772778 kc_text_block\">\n<h5 class=\"p2\" data-mce-style=\"padding-left: 30px;\"><strong></strong></h5>\n</div>\n</div>\n</div>\n<div style=\"text-align: center;\" data-mce-style=\"text-align: center;\">\n<h1 style=\"text-align: center;\" data-mce-style=\"text-align: center;\"></h1>\n</div>"""
    Sfd = StringFeildDensity()
    a = Sfd.zlib_zip(test_text)
    print(f"压缩后文本: {a} \n { '=' * 33} \n ")
    print(f"压缩后数据类型为: {type(a)}")
    print(Sfd.unzlib_zip(a))
相关输出:
## 正在使用 Zlib + Base64 压缩方法
## 源字符串所占字节大小: 4371, Zlib 压缩后所占字节大小: 1142, 压缩后 Zlib + Base64 所占字节大小: 1529
压缩后文本: eJzNV9tu4zYQfc9XTPWyu4BlXSzfsraLoPsSoE0X/QGDliiLXVJkRcrr9Gv61vo7/GMdSrLiNLITNA6QB8sWyeGcOZyZQ88ENQTijBSamrlTmtSdOIurWcI2+OychJlWJF/MvOrraubVa7MItLnndO4YujUu4WydX0NMc0OLzw4kxBBXxNQ9s2hxkyQyB5qDkvxe7P8pKDi3ORPEgViWnJYF7P9CQJJte5BQ4IhOck5jw9DO+VluqDNbFYtu4Ag1iy6E9KPKpJGQo9tY5qYgsSkpIumBpiUH/oHUoWiD80IVTOO+ua4RC0HyhH66IJyrKmr8fKEaZ+AabgRDX19lqcmfduIQPB7WOXeLGRNr0EU8dzJjlL72vDjJ+zqTiqX3fcTuaS9lnGov8PzxdOKFA3/QjHDkf9j/TlfLwA+jrX30f1frHzfzYDSIwmk0GA4d+M4Sk82ddokDGWXrzDwaaiCmXBJzbWmmFluTai+LoWMHIBzdOK+Jb3w2vnHwgPIy52pDeT3q0TnUkR+eIvwNiZychRRMj+o1eD2RX4v9Lial7RMaPGB5KgtBqtdDdQRNZsWcaD13VOA8TjWFJc3ytctpijxMfbU9Skl1ZNaF1hp9hq4tzuI/bba4w9KGjX0UNE9sWMQYDJel+KuElDADf5RNj6x7p+2Yh8Zk7Jum2Jao1gytFS03aA4bUjBa4BTHZWjMS8FsJ+5XLcZTJ4I9H1pakLXA3bHGnRPduVKVExY3dWQy7yEjGF5SxYs60YhQbduAYvyU41ZVHpl1rwWNbR1ZyDVbVT7LLahCJiUzGrEzwZBc3cN6MERYK0u6IkVaCtQAyTckN6hR+x2Sm6JA4SuqGh6C3UwQZLwHJN7vDNYTyBKtDapd4wE0s+2b4cgP8AKwXxppwSTHxDH7ncWFmVE9aIq5vv9bWo945tUYUegpzqiFA4rjiJK6irSV1UPKtHSnbF0WNoxayDB7sNb78BNVmH9VtIzbLDJwD2QjWW3M97u1pRwTjaXpfofJGldZB4YyLM4mrZoQTSHz9akTsSvbTABb3KbGBvkHK7SK6EpssaxtIGRDYxvKimgKWFMFAS0I5/BxKsSnPvqsvJ3J6bctYBsO1M4PinGBRncnbR5heilWVP3tv+3tebn5n0399u72l5u7X29/W0YTf4ufvsrblj6ZBGHYav/I97f4eVD+dqBTbDrz4YiON8PbnJHN0NcSc8LJYPAOSTmN9TKE4IV+TZfUn/io87E7mMYjN5pOUAZW1HfDiIyDVUpoRKIuJOFwNB6/L9YuEdBlqLU3q6C+ox48PVysBn44Gr0z6l4CeNH0sCe3/8d9ddTdjrsWLS7Zcp/eHb/FLuUC8CvW2h3YMCJ8W+KfVVcLd9L8LkV+POo82cTO2L+XeF2gxdPpIx/jcTgeV/taiMsVl/E3a5ANW10Ln6Nm0FDT6mL7Ixs+0P/46xlFeem/nAseQwXsX2Cii8s= 
 ================================= 
 
压缩后数据类型为: <class 'str'>
<meta charset="utf-8">
<div>
<meta charset="utf-8"> <span></span>
</div>
<h4 style="text-align: center;" data-mce-style="text-align: center;">Addon en polymère "Inima" couleur à choix, de la collection "Love"<br><meta charset="utf-8">
</h4>
<h4 style="text-align: center;" data-mce-style="text-align: center;">(photo non contractuelle, seul l'addon est compris dans la commande)</h4>
<h4 style="text-align: center;" data-mce-style="text-align: center;">
<br><br>Design : Amila Pousaz<br>
</h4>
<div style="text-align: center;"><img src="https://cdn.shopify.com/s/files/1/0798/2303/files/love5.web_1024x1024.jpg?v=1634294355" width="1024x1024" height="1024x1024" style="float: none;"></div>
<div style="text-align: center;"><img style="float: none;" alt="" src="https://cdn.shopify.com/s/files/1/0798/2303/files/love7.web_1024x1024.jpg?v=1634294371"></div>
<h4 style="text-align: center;" data-mce-style="text-align: center;">
<img alt="" src="https://cdn.shopify.com/s/files/1/0798/2303/files/love6.web_1024x1024.jpg?v=1634294402" style="float: none;"><img style="float: none;" alt="" src="https://cdn.shopify.com/s/files/1/0798/2303/files/love8.web_1024x1024.jpg?v=1634294419">
</h4>
<h1 style="text-align: center;" data-mce-style="text-align: center;">Précautions / informations<br>
</h1>
<div class="p1">
<div style="padding-left: 90px;"></div>
<p class="p1" style="text-align: left; padding-left: 90px;" data-mce-style="text-align: left; padding-left: 90px;">Nous vous rendons attentifs au fait que la couleur de l'addon et de ses dessins peuvent varier selon la lumière.<br></p>
<p class="p1" style="padding-left: 90px;" data-mce-fragment="1"><meta charset="utf-8"><span data-mce-fragment="1">Attention, les addons en </span><span class="il" data-mce-fragment="1">polymère</span><span data-mce-fragment="1"> sont sensibles aux produits chimiques, notamment au parfum, solvant, désinfectant pour les mains, acétone ou autre produit similaire ! </span><span data-mce-fragment="1">Dans la réalité, nous nous efforçons, de nous approcher le plus possible de la couleur des addons figurant dans le shop. Cependant, il peut y avoir des légères différences de teinte.<br></span><strong data-mce-fragment="1"> <br>Attention : cet addon n'est pas compatible avec la base extra small (9mm).</strong></p>
<p class="p1" style="text-align: left; padding-left: 90px;" data-mce-style="text-align: left; padding-left: 90px;"><br> </p>
</div>
<h1 style="text-align: center;" data-mce-style="text-align: center;">Notre inspiration<br>
</h1>
<div style="text-align: center;">
<img src="https://cdn.shopify.com/s/files/1/0798/2303/files/INIMANOIR_480x480.png?v=1634288122" width="600x600" height="600x600" style="float: none;" data-mce-fragment="1" data-mce-src="https://cdn.shopify.com/s/files/1/0798/2303/files/INIMANOIR_480x480.png?v=1634288122"><br> <br><img src="https://cdn.shopify.com/s/files/1/0798/2303/files/INIMA_480x480.png?v=1634288133" width="600x600" height="600x600" style="float: none;" data-mce-fragment="1" data-mce-src="https://cdn.shopify.com/s/files/1/0798/2303/files/INIMA_480x480.png?v=1634288133"><br> <br><img src="https://cdn.shopify.com/s/files/1/0798/2303/files/image_e080419c-39c6-498f-8be0-24a71bfae4a4_480x480.png?v=1634225677" width="600x600" height="600x600" style="float: none;" data-mce-fragment="1" data-mce-src="https://cdn.shopify.com/s/files/1/0798/2303/files/image_e080419c-39c6-498f-8be0-24a71bfae4a4_480x480.png?v=1634225677"><br> <br><img src="https://cdn.shopify.com/s/files/1/0798/2303/files/love17.web_480x480.jpg?v=1634302667" width="600x600" height="600x600" style="float: none;" data-mce-fragment="1" data-mce-src="https://cdn.shopify.com/s/files/1/0798/2303/files/love17.web_480x480.jpg?v=1634302667"><br>
</div>
<div style="padding-left: 60px;" data-mce-style="padding-left: 60px;"></div>
<h1 style="text-align: center;" data-mce-style="text-align: center;"></h1>
<div class="kc-elm kc-css-330264 kc_col-sm-8 kc_column kc_col-sm-8">
<div class="kc-col-container">
<div class="kc-elm kc-css-772778 kc_text_block">
<h5 class="p2" data-mce-style="padding-left: 30px;"><strong></strong></h5>
</div>
</div>
</div>
<div style="text-align: center;" data-mce-style="text-align: center;">
<h1 style="text-align: center;" data-mce-style="text-align: center;"></h1>
</div>
测试二:
    test_text = """ひと塗りで唇の上でとろけるように伸びていくテクスチャーと、大胆でセンシブルな10色の高発色マットリップスティック"""
    Sfd = StringFeildDensity()
    a = Sfd.zlib_zip(test_text)
    print(f"压缩后文本: {a} \n { '=' * 33} \n ")
    print(f"压缩后数据类型为: {type(a)}")
    print(Sfd.unzlib_zip(a))
相关输出:
## 正在使用 Zlib + Base64 压缩方法
## 源字符串所占字节大小: 186, Zlib 压缩后所占字节大小: 168, 压缩后 Zlib + Base64 所占字节大小: 229
压缩后文本: eJwdjVEKglAQRbdUO2xmwqyICCLrJwgjwwcK+ZGVuzk+sl30nn/nzuWeQR7I3V8ydIUUfr9Aqr6NHO7oBtmhazRFEsT1XYs0yA2ZI1ssQWv0hQmWY11czcRfiyFUQaIfrEGf2AFzSDmdDMvws/q54/f0jmxnzLAUK0fIRl8Q5zFq/Qe/7m5V 
 ================================= 
 
压缩后数据类型为: <class 'str'>
ひと塗りで唇の上でとろけるように伸びていくテクスチャーと、大胆でセンシブルな10色の高発色マットリップスティック

注意事项

  1. 提供 #测试一# 与 #测试二# 的目的是提醒大家,gzlib + base64 并不是所有字符串压缩后都越来越短,在提供的数据字段过于 ## 的情况下不建议使用 gzlib + base64 压缩方式,针对 ##数据就挺好用。
  2. base64 的加密方法并不是都带有 = 号结尾,只有不能被四整除的数据才会有 = 用于补充字段,这一点我们可以利用起来,经过测试,我发现不管加密后的数据有没有等号,再后面强行加上 = 后解密结果不会发生改变(测试量少,如能反驳,请轻点打!)

此文档仅用于个人学习
如果有更好的压缩方法,请将链接贴于文档回答处,方便大家共同进步 ~ 对于 #灰常牛# 的方法我将直接贴近文档,并提供举例与注释。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值