Невозможно выбрать существующую строку через одно имя столбца - PullRequest
1 голос
/ 12 сентября 2011

У меня есть база данных sqlite3 с таблицей с именем users.В таблице есть столбец с именем activation_token, имеющий тип VARCHAR(255).

. В этой таблице есть одна строка, заполняющая этот столбец

900395b3d2faf7d553f719df666d1a755fb7aef0

.вернуть эту запись, но я не получаю вывод:

SELECT * FROM users 
WHERE activation_token = '900395b3d2faf7d553f719df666d1a755fb7aef0';

На самом деле вывод этой команды действительно смущает меня

SELECT activation_token FROM users 
where activation_token != '900395b3d2faf7d553f719df666d1a755fb7aef0';

900395b3d2faf7d553f719df666d1a755fb7aef0

Что я делаю не так?

Вывод .schema users чтобы убедиться, что я получаю правильное имя столбца:

CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "email" varchar(255), "crypted_password" varchar(255), "salt" varchar(255), "created_at" datetime, "updated_at" datetime, "remember_me_token" varchar(255) DEFAULT NULL, "remember_me_token_expires_at" datetime DEFAULT NULL, "activation_state" varchar(255) DEFAULT NULL, "activation_token" varchar(255) DEFAULT NULL, "activation_token_expires_at" datetime DEFAULT NULL, "reset_password_token" varchar(255) DEFAULT NULL, "reset_password_token_expires_at" datetime DEFAULT NULL, "reset_password_email_sent_at" datetime DEFAULT NULL, "last_login_at" datetime DEFAULT NULL, "last_logout_at" datetime DEFAULT NULL, "last_activity_at" datetime DEFAULT NULL, "failed_logins_count" integer DEFAULT 0, "lock_expires_at" datetime DEFAULT NULL);
CREATE INDEX "index_users_on_activation_token" ON "users" ("activation_token");
CREATE INDEX "index_users_on_last_logout_at_and_last_activity_at" ON "users" ("last_logout_at", "last_activity_at");
CREATE INDEX "index_users_on_remember_me_token" ON "users" ("remember_me_token");

Вывод SELECT '->' || activation_token || '<-' FROM users;, чтобы проверить, что пробелов нет:

->900395b3d2faf7d553f719df666d1a755fb7aef0<-

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

Чтобы проверить, какое значение на самом деле находится в столбце Activation_token, я бы порекомендовал следующее:

SELECT '%' || activation_token || '%' FROM users WHERE 1=1;

Знаки процента должны сделать очевидным наличие пробелов в начале или конце значения.

1 голос
/ 12 сентября 2011

У вас есть значение activation_token, равное '900395b3d2faf7d553f719df666d1a755fb7aef0', с некоторыми пробелами в конце. Например:

sqlite> create table pancakes (activation_token varchar(255));
sqlite> insert into pancakes values('900395b3d2faf7d553f719df666d1a755fb7aef0');
sqlite> insert into pancakes values('900395b3d2faf7d553f719df666d1a755fb7aef0      ');

sqlite> select activation_token from pancakes;
activation_token
900395b3d2faf7d553f719df666d1a755fb7aef0
900395b3d2faf7d553f719df666d1a755fb7aef0      

sqlite> select '->' || activation_token || '<-' from pancakes;
'->' || activation_token || '<-'
->900395b3d2faf7d553f719df666d1a755fb7aef0<-
->900395b3d2faf7d553f719df666d1a755fb7aef0      <-

sqlite> select '->' || activation_token || '<-' from pancakes where activation_token = '900395b3d2faf7d553f719df666d1a755fb7aef0';
'->' || activation_token || '<-'
->900395b3d2faf7d553f719df666d1a755fb7aef0<-

sqlite> select '->' || activation_token || '<-' from pancakes where activation_token != '900395b3d2faf7d553f719df666d1a755fb7aef0';
'->' || activation_token || '<-'
->900395b3d2faf7d553f719df666d1a755fb7aef0      <-

Это сообщение из списка рассылки SQLite может представлять интерес:

http://www.mail-archive.com/sqlite-users@sqlite.org/msg30848.html

PostgreSQL 9 демонстрирует то же поведение, MySQL 5.1 сохраняет пробелы, но игнорирует их для сравнения; Там могут быть параметры конфигурации, чтобы изменить это поведение. У меня больше ничего нет под рукой, поэтому я не могу проверять других.

0 голосов
/ 12 сентября 2011

Во втором запросе вы SELECT столбец с именем activation_code, в то время как вы ограничиваете на основе activation_token.Я думаю, что у вас есть обе колонки, и вы путаете их в своих запросах.

...