我不必使用SQLite3 shell工具来维护一个小型数据库。我使用-header -ascii
标志,虽然这适用于 - 我可以告诉 - 任何输出选择。我正在寻找一种方法来避免对返回的任何一个值的类型产生歧义。请考虑以下事项:
Create Table `things` (`number` Integer, `string` Text, `binary` Blob);
Insert Into `things` (`number`,`string`,`binary`) Values (4,'4',X'34');
Select * From `things`;
返回(使用caret notation):
number^_string^_binary^^4^_4^_4^^
很明显,没有办法推断任何一个' 4'单独的响应中的字符 ,因为它们都没有区别的分隔符。
有没有办法强制将类型元数据包含在响应中?
我想避免:
更改查询语句还包括类似于混淆的类型,并且在我切换接口的情况下会是多余的;
在插入之前添加TEXT和BLOB值,因为这对于所有 TEXT和BLOB交互必须是统一的(说来,如果它是这样的话,这仍然是我的首选)。
我正在寻找的是某种类型的转换,表明类型是SQLite的响应的一部分,例如:
number^_string^_binary^^4^_'4'^_X'4'^^
number^_string^_binary^^4^_text:4'^blob:4^^
或其一些变化。对此的基本原则是响应本身包含足够的信息来识别该响应的每个元素的类型和值(在SQLite库API中sqlite3_column_type()
允许的方式非常相似)。
更新:自从@ mike-sherrill-cat-recall首次回答澄清期望以来,我已经对这个问题进行了改进。
答案 0 :(得分:1)
在SQLite中,回显列的数据类型并不总是有意义的。 SQLite没有传统意义上的 列式数据类型。您可以在SQL中使用NSCoding
来显示表达式X"的数据类型。
typeof(X)
将文本插入整数列成功。
sqlite> create table test (n integer, d decimal(8, 2));
sqlite> insert into test (n, d) values (8, 3.14);
sqlite> insert into test (n, d) values ('wibble', 'wibble');
n typeof(n) d typeof(d) ---------- ---------- ---------- ---------- 8 integer 3.14 real wibble text wibble text
你可以连接任何你喜欢的东西 - 甚至可以产生插入符号 - 但它有点笨拙。
sqlite> select n, typeof(n), d, typeof(d) from test;
caret_n ------------------------- (integer)^_8 (text)^_wibble
<小时/> SQLite Core Functions
答案 1 :(得分:0)
shell始终将打印值转换为字符串。 (那是&#34;打印&#34;意思是什么。)
如果您不想为类型添加单独的输出列,可以使用quote function根据SQL语法规则输出所有值:
sqlite> with v(x) as (values (null), (1), (2.3), ('hello'), (x'00')) select quote(x) from v;
NULL
1
2.3
'hello'
X'00'