Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Sqlite中创建Blob列_Sqlite - Fatal编程技术网

在Sqlite中创建Blob列

在Sqlite中创建Blob列,sqlite,Sqlite,我正在尝试在SQLite中创建一个具有blob类型列(内容)的表: 但是,以下内容不被接受: Content varbinary (max) null constraint DF_File_Content default (0x), 为什么?“Max”是标准SQLite3函数的名称,因此不能作为类型名称的一部分使用。请参阅和的语法参考。A可以在括号中包含数字(忽略),但不能包含单词“MAX” 看起来您正在尝试使用MS SQL Server语法,代码中有几个错误: 如上所

我正在尝试在SQLite中创建一个具有blob类型列(内容)的表:

但是,以下内容不被接受:

    Content varbinary (max) null
       constraint DF_File_Content default (0x),

为什么?

“Max”是标准SQLite3函数的名称,因此不能作为类型名称的一部分使用。

请参阅和的语法参考。A可以在括号中包含数字(忽略),但不能包含单词“MAX”

看起来您正在尝试使用MS SQL Server语法,代码中有几个错误:

  • 如上所述,
    (max)
    不被接受为类型名称的一部分。由于默认情况下值长度是不受约束的,因此只需将其忽略即可
  • varbinary
    给出“数值关联”列。虽然这样的列可以存储blob,但您可能希望将其声明为
    blob
  • 0x
    不是有效的blob文本。写入空blob的正确方法是
    x'
  • identity
    被调用。为了使用它,类型名必须是
    integer
    ,而不是
    int
    notnull
    是多余的:如果您尝试在这样的列中插入null值,您将得到自动递增的ROWID。
    • 注意:如果您只需要
      Id
      在任何给定时间具有唯一的值,并且不关心以前删除的值是否被重复使用,那么您只需将列声明为
      整数主键
      ,插入
      null
      将用未使用的整数填充该列。
      autoincrement
      关键字防止在数据库的生命周期内重复使用rowid,这与MS-SQL的
      identity
      关键字的语义更为匹配。请参阅上面链接中的讨论
  • 虽然从语法上讲,为列约束声明名称是合法的,但这并不是必需的
试试这个:

create table [Files]
(
    Id integer primary key autoincrement,
    MimeType nvarchar (400) not null,
    Content blob null default (x'')
);

请注意,这不会对
MimeType
列强制执行长度限制。如果需要,请添加约束
检查(长度(MimeType)是否确定使用的是SQLite?
varbinary
在该引擎中不是有效的类型。这没有任何区别-您对类型名称几乎使用任何东西-但“max”是为标准函数保留的。与您的问题无关,但如果您有包含整数的主键列,则需要将其声明为
integer
(而不是
int
)为了使其成为ROWID的别名。在SQLite中,确切的类型名称很重要。为了补充dan04的注释,请显式指定“integer主键”。还有一件事,我忘记了您想要“在SQLite中创建一个具有blob类型column(Content)”的表,但您将列内容声明为“Content varbinary(max)null”。根据,您声明的类型必须包含字符串“BLOB”;“varbinary”将导致类型“NUMERIC”关联。(有关详细信息,请参阅链接。)两点:(1)关于“0x”的无效性,您是正确的,但为什么要将blob表的默认值设为空blob?为什么不将默认值设为NULL?(2)为什么说“identity称为autoincrement”?我不知道在这里使用它是否有什么特殊的原因,事实上,我认为在没有必要的地方使用过度(“integer主键非NULL”)在使用它之前,先看一下关于实现的讨论。(除此之外,我支持你的所有其他观点。)实际上,我甚至不认为“整型主键”需要“NOTNULL”。@varro:(1)因为它与问题中原始t-SQL代码的语义相匹配。(2)我已经为这一点添加了一个澄清说明。好吧,我想我们是一致的。
create table [Files]
(
    Id integer primary key autoincrement,
    MimeType nvarchar (400) not null,
    Content blob null default (x'')
);