sqlite表a有一列 secure_name varchar(128) 存储加密数据的,例如 gAAAAAby5666....... . 当我发出命令时,为什么数据变为长度超过128的x'67837483473843 .dump 将数据导出到文件?
secure_name varchar(128)
gAAAAAby5666.......
.dump
m2xkgtsf1#
因为.dump命令(emphasis mine):将sqlite数据库的整个结构和数据转换为单个文本文件。字符串文本的长度是不相关的,重要的是它编码的二进制数据的长度。
cld4siwp2#
所以。。。如果您希望sqlite像postgres、oracle或其他rdms那样工作,那么您将被烧死。它有自己的小特性,值得花时间浏览文档来了解它是如何工作的。在这种情况下,数据类型的描述至关重要。表中存储的每个值都有自己的关联类型。列的类型(aka affinity)只是值的首选存储类型;如果某个东西可以无损地转换为所需的类型,那么它就是,否则就使用原始类型。在这种情况下,既然你看到 X'...' 值是blob文本,该列用于存储任意字节的blob,而不是unicode字符串。类型 varchar(128) 是的,因为它有绳子 char 在它里面,被当作sqlite TEXT 列关联。blob不能转换为文本字符串,因此表中的blob值未经转换而存储,并以blob文字显示 .dump . (加上长度限制,如 (128) 无论如何都会被忽略。)
X'...'
varchar(128)
char
TEXT
(128)
2条答案
按热度按时间m2xkgtsf1#
因为.dump命令(emphasis mine):
将sqlite数据库的整个结构和数据转换为单个文本文件。
字符串文本的长度是不相关的,重要的是它编码的二进制数据的长度。
cld4siwp2#
所以。。。如果您希望sqlite像postgres、oracle或其他rdms那样工作,那么您将被烧死。它有自己的小特性,值得花时间浏览文档来了解它是如何工作的。在这种情况下,数据类型的描述至关重要。
表中存储的每个值都有自己的关联类型。列的类型(aka affinity)只是值的首选存储类型;如果某个东西可以无损地转换为所需的类型,那么它就是,否则就使用原始类型。在这种情况下,既然你看到
X'...'
值是blob文本,该列用于存储任意字节的blob,而不是unicode字符串。类型
varchar(128)
是的,因为它有绳子char
在它里面,被当作sqliteTEXT
列关联。blob不能转换为文本字符串,因此表中的blob值未经转换而存储,并以blob文字显示.dump
. (加上长度限制,如(128)
无论如何都会被忽略。)