我正在尝试在字符串列中插入字符串“ 02”。我可以很清楚地看到,正在发出“ 02”作为命令“ REPLACE INTO Users(ID,Terminal)values('00000000001','02')”。但是,当将其放入数据库中时,它似乎是一个整数(删除前导零),然后以字符串形式读取它时会导致错误。
最令人困惑的部分是ID字符串有效(也许是因为该列是(ID VARCHAR(11)NOT NULL)而Terminal是一个字符串吗?我知道如果将该列设置为整数,则此行为是有意义的,但是我已经将该列设置为字符串,并且可以在模式中看到它是一个字符串。我觉得我必须丢失一些明显的东西,但是我找不到它。
在字符串列中将字符串转换为整数,而我肯定是将其作为字符串输入并且肯定是将其输入到字符串列中。我看来可以使它起作用的唯一方法是在字符串中添加一个字母字符,并将其正确插入,检索时我必须将其删除,但这似乎是一个糟糕的解决方案,只是为了确保类型正确。>
答案 0 :(得分:2)
字符串不是已知的类型相似性,因此会根据规则进行转换(请参见下面链接中的第3.1段)
VAR
CHAR (11)
的类型相似性为 TEXT ))。具有NUMERIC关联性的列可能包含使用全部五个值的值 存储类。将文本数据插入NUMERIC列时, 文本的存储类将转换为INTEGER或REAL(按 偏好),如果这种转换是无损且可逆的。对于 SQLite认为TEXT和REAL存储类之间的转换 如果前15个转化是无损且可逆的, 保留数字的有效十进制数字。如果 不可能将TEXT无损转换为INTEGER或REAL 该值使用TEXT存储类存储。没有尝试 转换NULL或BLOB值。
因此,您需要更改类型相似性以满足第二条规则。
例如考虑以下:-
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS users_alt;
CREATE TABLE IF NOT EXISTS users(id VARCHAR(11), terminal string);
CREATE TABLE IF NOT EXISTS users_alt(id VARCHAR(11), terminal TEXT);
INSERT INTO users VALUES('00000000001','01');
INSERT INTO users_alt VALUES('00000000001','01');
REPLACE INTO users (id,terminal) VALUES('00000000001','02');
REPLACE INTO users_alt (id,terminal) VALUES('00000000001','02');
SELECT * FROM users;
SELECT * FROM users_alt;
用户表的第一个结果是:-
虽然第二个结果,对于users_alt表是:-
或者,您可以执行以下操作:-
SELECT id,
CASE
WHEN length(terminal) = 2 THEN terminal
ELSE '0'||terminal
END AS terminal
FROM users;
这将导致:-