string不是已知的类型关联,因此它是根据规则转换的(参见下面链接中的第 3.1 段)
- 它不包含INT(因此没有给出INTEGER的类型亲和力)。
- 它不包含CHAR、CLOB或TEXT(因此没有给定 TEXT 的类型亲和性( CHAR被赋予了TEXT的类型亲和性 ))。
VAR(11)
- 它不包含BLOB(因此没有给出BLOB的类型亲和力)
- 它不包含REAL、FLOA或DOUB(因此没有给出REAL的类型亲和力)。
- 它因此被赋予了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;
这将导致:-
