SQLite:字符串列中的字符串自动转换为整数

时间:2018-11-19 20:31:47

标签: sqlite replace

我正在尝试在字符串列中插入字符串“ 02”。我可以很清楚地看到,正在发出“ 02”作为命令“ REPLACE INTO Users(ID,Terminal)values('00000000001','02')”。但是,当将其放入数据库中时,它似乎是一个整数(删除前导零),然后以字符串形式读取它时会导致错误。

最令人困惑的部分是ID字符串有效(也许是因为该列是(ID VARCHAR(11)NOT NULL)而Terminal是一个字符串吗?我知道如果将该列设置为整数,则此行为是有意义的,但是我已经将该列设置为字符串,并且可以在模式中看到它是一个字符串。我觉得我必须丢失一些明显的东西,但是我找不到它。

在字符串列中将字符串转换为整数,而我肯定是将其作为字符串输入并且肯定是将其输入到字符串列中。我看来可以使它起作用的唯一方法是在字符串中添加一个字母字符,并将其正确插入,检索时我必须将其删除,但这似乎是一个糟糕的解决方案,只是为了确保类型正确。

1 个答案:

答案 0 :(得分:2)

字符串不是已知的类型相似性,因此会根据规则进行转换(请参见下面链接中的第3.1段)

  1. 它不包含 INT (因此,的类型相似性为 INTEGER )。
  2. 它不包含 CHAR CLOB TEXT (因此未提供 TEXT 的类型相似性({VAR CHAR (11)的类型相似性为 TEXT )。
  3. 它不包含 BLOB (因此未赋予 BLOB 类型相似性)
  4. 它不包含 REAL FLOA DOUB (因此未赋予类型关联性 REAL )。
  5. 在此为它赋予类型关联性 NUMERIC ,因此:-
  

具有NUMERIC关联性的列可能包含使用全部五个值的值   存储类。将文本数据插入NUMERIC列时,   文本的存储类将转换为INTEGER或REAL(按   偏好),如果这种转换是无损且可逆的。对于   SQLite认为TEXT和REAL存储类之间的转换   如果前15个转化是无损且可逆的,   保留数字的有效十进制数字。如果   不可能将TEXT无损转换为INTEGER或REAL   该值使用TEXT存储类存储。没有尝试   转换NULL或BLOB值。

Datatypes In SQLite Version 3

因此,您需要更改类型相似性以满足第二条规则。

例如考虑以下:-

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;

用户表的第一个结果是:-

enter image description here

虽然第二个结果,对于users_alt表是:-

enter image description here

或者,您可以执行以下操作:-

SELECT id,
    CASE 
        WHEN length(terminal) = 2 THEN terminal
        ELSE '0'||terminal
    END AS terminal
FROM users;

这将导致:-

enter image description here

  • 注意,显然以上内容是有局限性的,只是形式上的演示。