相关代码在数据库中,我们经常会用到一种字段类型,那就是 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 = """nn nn相关输出:Addon en polymère "Inima" couleur à choix, de la collection "Love"
nn(photo non contractuelle, seul l'addon est compris dans la commande)n
n
Design : Amila Pousaz
nnnnnnn
Précautions / informations
nnnnNous vous rendons attentifs au fait que la couleur de l'addon et de ses dessins peuvent varier selon la lumière.
nAttention, les addons en polymère sont sensibles aux produits chimiques, notamment au parfum, solvant, désinfectant pour les mains, acétone ou autre produit similaire ! 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.
n
Attention : cet addon n'est pas compatible avec la base extra small (9mm).nn
Notre inspiration
nnn
nnnnnnn
nnnnn
n""" 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= ================================= 压缩后数据类型为:测试二:Addon en polymère "Inima" couleur à choix, de la collection "Love"
(photo non contractuelle, seul l'addon est compris dans la commande)
Design : Amila Pousaz
![]()
Précautions / informations
Nous vous rendons attentifs au fait que la couleur de l'addon et de ses dessins peuvent varier selon la lumière.
Attention, les addons en polymère sont sensibles aux produits chimiques, notamment au parfum, solvant, désinfectant pour les mains, acétone ou autre produit similaire ! 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.
Attention : cet addon n'est pas compatible avec la base extra small (9mm).
Notre inspiration
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 ================================= 压缩后数据类型为:注意事项ひと塗りで唇の上でとろけるように伸びていくテクスチャーと、大胆でセンシブルな10色の高発色マットリップスティック
- 提供 #测试一# 与 #测试二# 的目的是提醒大家,gzlib + base64 并不是所有字符串压缩后都越来越短,在提供的数据字段过于 #短# 的情况下不建议使用 gzlib + base64 压缩方式,针对 #长#数据就挺好用。
- base64 的加密方法并不是都带有 = 号结尾,只有不能被四整除的数据才会有 = 用于补充字段,这一点我们可以利用起来,经过测试,我发现不管加密后的数据有没有等号,再后面强行加上 = 后解密结果不会发生改变(测试量少,如能反驳,请轻点打!)
此文档仅用于个人学习
如果有更好的压缩方法,请将链接贴于文档回答处,方便大家共同进步 ~ 对于 #灰常牛# 的方法我将直接贴近文档,并提供举例与注释。









