gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:39:06 26 4
gpt4 key购买 nike

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

最令人困惑的部分是 ID 字符串有效(也许是因为列是 (ID VARCHAR(11) NOT NULL),而终端是字符串?我知道如果列设置为整数,这种行为是有意义的,但是我已将该列设置为一个字符串,我可以在架构中看到它是一个。我觉得我一定错过了一些明显的东西,但我无法发现它。

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

最佳答案

字符串不是已知的类型关联,因此它根据规则进行转换(请参阅下面链接中的第3.1段)

  1. 它不包含INT(因此赋予INTEGER类型亲和性)。
  2. 它不包含 CHARCLOBTEXT(因此未赋予 TEXT 类型关联性) (VARCHAR(11) 的类型亲和性为 TEXT)) .
  3. 它不包含BLOB(因此没有赋予BLOB类型亲和性)
  4. 它不包含 REALFLOADOUB(因此未赋予 REAL 类型关联性) )。
  5. 因此,它的类型亲和性为 NUMERIC,因此:-

A column with NUMERIC affinity may contain values using all five storage classes. When text data is inserted into a NUMERIC column, the storage class of the text is converted to INTEGER or REAL (in order of preference) if such conversion is lossless and reversible. For conversions between TEXT and REAL storage classes, SQLite considers the conversion to be lossless and reversible if the first 15 significant decimal digits of the number are preserved. If the lossless conversion of TEXT to INTEGER or REAL is not possible then the value is stored using the TEXT storage class. No attempt is made to convert NULL or BLOB values.

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;

users 表的第一个结果是:-

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

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

关于SQLite:字符串自动转换为字符串列中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com