2

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

极其令人困惑的部分是 ID 字符串有效(可能是因为列是 (ID VARCHAR(11) NOT NULL) 而终端是字符串?我知道如果将列设置为整数,这种行为会有意义,但我已经设置了将列转换为字符串,我可以在模式中看到它是一个。我觉得我必须遗漏一些明显的东西,但我无法发现它。

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

4

1 回答 1

3

string不是已知的类型关联,因此它是根据规则转换的(参见下面链接中的第 3.1 段)

  1. 它不包含INT(因此没有给出INTEGER的类型亲和力)。
  2. 它不包含CHARCLOBTEXT(因此没有给定 TEXT 的类型亲和性 CHAR赋予了TEXT的类型亲和性 )。VAR(11)
  3. 它不包含BLOB(因此没有给出BLOB的类型亲和力)
  4. 它不包含REALFLOADOUB(因此没有给出REAL的类型亲和力)。
  5. 它因此被赋予了NUMERIC的类型亲和力,因此:-

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

SQLite 版本 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表,第一个结果是:-

在此处输入图像描述

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

在此处输入图像描述

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

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

这将导致:-

在此处输入图像描述

  • 注意显然以上有局限性,只是形式示范。
于 2018-11-19T22:31:34.043 回答