SQLite: строка автоматически преобразуется в целое число в столбце строки - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь вставить строку "02" в столбец строки. Я очень четко вижу, что «02» выдается как команда «ЗАМЕНИТЬ ВНУТРИ значения пользователей (ID, Терминал) (« 00000000001 »,« 02 »)». Однако, когда он помещается в базу данных, он вводится как целое число (удаляя начальный ноль), а затем вызывает ошибку при чтении его в виде строки.

Чрезвычайно запутанная часть состоит в том, что строка идентификатора работает (возможно, потому что столбец (ID VARCHAR (11) NOT NULL), в то время как Терминал является строкой? Я знаю, что если бы столбец был установлен в целое число, это поведение имело бы смысл, но Я установил столбец в строку, и я вижу в схеме, что он один. Мне кажется, что я упускаю что-то очевидное, но не могу это заметить.

Строка преобразуется в целое число в строковом столбце, в то время как я определенно ввожу его в виде строки и определенно ввожу в столбец строки. Единственный способ, которым я могу заставить это работать, - это добавить в строку буквенный символ, и он будет вставлен правильно, и мне придется удалить его при извлечении, но это кажется плохим решением, чтобы получить правильный тип.

1 Ответ

0 голосов
/ 20 ноября 2018

string не является аффинностью известного типа и, следовательно, она преобразуется в соответствии с правилами (см. Пункт 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 сходством может содержать значения, использующие все пять классы хранения. Когда текстовые данные вставляются в числовой столбец, класс хранения текста преобразуется в INTEGER или REAL (в порядке предпочтение), если такое преобразование без потерь и обратимо. За SQLite рассматривает преобразования между классами хранения TEXT и REAL преобразование должно быть без потерь и обратимым, если первые 15 значимые десятичные цифры числа сохраняются. Если Преобразование TEXT в INTEGER или REAL без потерь тогда невозможно значение сохраняется с использованием класса хранения TEXT. Никаких попыток не предпринимается для преобразования значений NULL или BLOB.

Типы данных в SQLite версии 3

Так что вам нужно изменить родство типов, чтобы соответствовать 2-му правилу.

например. учитывать следующее: -

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;

1-й результат для пользователей таблицы: -

enter image description here

В то время как 2-й результат для таблицы 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

  • ПРИМЕЧАНИЕ Очевидно, что вышеизложенное имеет ограничения и является лишь демонстрацией формы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...