【问题标题】:Why sqlite .dump encrypted data to x'2384934..' rather than raw data?为什么 sqlite .dump 加密数据到 x'2384934..' 而不是原始数据?
【发布时间】:2018-12-27 07:37:24
【问题描述】:

SQLite 表 A 有一个列 secure_name varchar(128) 存储加密数据,例如 gAAAAAby5666.......。 为什么当我发出命令.dump将数据导出到文件时,数据变成了长度超过128的X'67837483473843....'?

【问题讨论】:

  • 这是一个 blob 文字,因此该列中存储的任何内容都存储为 blob,而不是字符串。至于varchar(128)...嗯...阅读sqlite.org/datatype3.html
  • 即二进制数据的十六进制编码。

标签: mysql sql sqlite


【解决方案1】:

因为.dump command(强调我的):

将 SQLite 数据库的整个结构和数据转换为单个文本文件

字符串文字的长度无关紧要,重要的是它编码的二进制数据的长度。

【讨论】:

  • 不是字符串字面量。
  • @Shawn 我认为这是根据docs:“BLOB 文字是包含十六进制数据的字符串文字,前面有一个“x”或“X”字符。示例:X'53514C697465'“
  • 没错。这是一个 blob 文字,而不是字符串。
  • 不,blob 和字符串是截然不同的不同类型。自己看:SELECT X'1234', typeof(X'1234'), '1234', typeof('1234');
  • @Shawn 我从字面上(双关语无意)引用官方文档:“BLOB 文字是字符串文字”。我不确定typeof 在这里添加了什么,因为它只返回表达式的数据类型。这就像争论 9.95 不是一个数字,因为typeof 返回REAL。如果您认为它不正确,您可以随时向文档团队提交关于拉取请求的错误报告,但我的印象是您根据数据类型解释实际上是 SQL 语法描述。
【解决方案2】:

所以...如果您希望 sqlite 的行为就像 postgres、oracle 或其他 RDMS 一样,那么您将被烧毁。它有自己的小特性,值得花时间阅读文档来了解它的工作原理。在这种情况下,datatypes 的描述至关重要。

存储在表中的每个值都有自己的关联类型。列的类型(AKA 亲和力)只是值的首选存储类型;如果某些东西可以无损地转换为所需的类型,则可以,否则使用原始类型。在这种情况下,由于您看到的是 X'...' 值,它们是 blob 文字,因此该列用于存储任意字节的 blob,而不是 unicode 字符串。

varchar(128) 的类型是,因为它包含字符串 char,所以被视为 sqlite TEXT 列关联。 Blob 无法转换为文本字符串,因此表中的 Blob 值未经转换存储,并由 .dump 显示为 Blob 文字。 (像(128) 这样的长度限制无论如何都会被忽略。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2018-02-17
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多