戒、、 2021-03-26 20:02 采纳率: 0%
浏览 464

python操作sqlite3数据库编码问题!

我遇到一个神奇的问题,最近在学习、研究sqlite3数据库,网上找到一个现有的数据库:

数据库中有个Monser表,其中Name列中的数据打开后显示为乱码:

使用pysqlite 对文本字段进行 bytes 字节读取:

发现可以使用GBK编码正确显示中文:

但在使用WHERE name=? 进行过滤的时候,却不能被正常过滤:

输出结果为:0

此时我感觉有点不妙了,怀疑 使用pysqlit3 模块操作sqlite3数据库无法使用BOBL数据类型进行WHERE过滤,为验证该结果,我使用同样类型的数据列,创建了一个新的数据库,和一张新的数据库表,存储数据进行验证:

网上的数据库列类型CHAR(14)

创建的新的数据库中,创建新的数据库表tb4在中创建数据列Name同样为CHAR(14)

存储数据:

使用在数据库中取出数据GBK编码后同样的字符串,进行GBK编码,存储数据后,打开数据库,神奇的事情发生了:

自己新建的数据库中,Name字段显示为bytes字节数据,与网络下载原数据库中的显示不一样:

更神奇的事情是,我在我自己创建的 tb_4表中,直接使用GBK编码后的字节流进行WHERE过滤,它是有效的:

输出结果可以被正常过滤:

我对这个问题感到非常的困惑,希望哪位老师能给予我解释、帮助:

 

问题1:

文字被GBK编码后的数据,就是机器码,是由0 和 1 组成的,所以它无论被存储在哪个数据库中它的值都应该是一致的,为什么两个数据库中的值不一致?

怀疑:sqlite3可能本身对数据库的属性设置编码是不同的?所以在使用pycharm打开数据库时,对同样的机器码用于显示的解码类型不同导致的?

 

问题2:

如果是设想的情况,只是打开数据库后,对于数据库中存储的机器码显示解码类型不同,那存储的机器码应该是一致的。这也就能说明虽然显示乱码字符不一致,但取出来的字节数据可以被正常GBK解码显示中文的情况。

 

问题3:

如果是这样,数据库中所存储数据的机器码既然一致,为什么使用SQL语句WHERE时,自己创建的数据库可以被正常过滤,而网络下载的现有数据库即不能正常查询过滤?

 

感谢各位!多谢!!

 

最新更新:测试发现,下载数据库中存储值的类型为TEXT,而自定义的数据库中存储为BLOB。

检测网上原有的数据库字段类型:

自定义数据库字段类型:

问题转变为:python3 中如何向sqlite数据库中添加、查询数据时,使用GBK编码字符串?

我不太明白,计算机中的所有字符串均是以01二进制字节数据进行存储的,它们之间的排列顺序取决于对该段文字的字符串编码。

我在python中,直接向sqlite发送GBK编码后的二进制字节数据,怎么才能将其在数据库中表示为TEXT?

数据库中的BOLB类型 与 TEXT类型又有什么区别? 文本字符串(TEXT),不就是一段被GBK编码后的二进制数据(BOLB)么???

  • 写回答

1条回答 默认 最新

  • 幻灰龙 2021-03-27 08:58
    关注

    你下载的数据库,里面的Name应该不是bytes数据,而是 string ,你自己加的测试, encode 成 gbk 后,写入的是 string 吧,这里还是有个类型不匹配问题,再加一次转换应该可以。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题