sqlite3 varchar соответствует «like», но не «=»

Использование Rails 3.1 и sqlite3 для разработки, тестирования сред.

Добавлена новая таблица в миграции:

create_table :api_keys do |t|
  t.string :api_key
  t.integer :user_id
  t.timestamps
end

Это создает таблицу со следующей схемой:

create_table "api_keys", :force => true do |t|
  t.string   "api_key"
  t.integer  "user_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

В модели ActiveRecord:

before_create :fill_api_key

private

def fill_api_key
  self.api_key = SecureRandom.hex(30)
end

ActiveRecord метод динамического поискаfind_by_api_key(api_key) не работает (возвращает ноль). То же самое с:

ApiKey.where({:api_key => 'something'}).first

В sqlite3 я делаю следующее:

insert into api_keys (id, api_key) values (-1, '12345');

Если я сейчас запускаю select:

select api_keys.* from api_keys where api_keys.api_key = '12345';

запись будет найдена.

Существующие данные, созданные из моего приложения, отображаются, если я запускаю неотфильтрованный выбор:

select api_keys.* from api_keys;

Если я пытаюсь найти ранее существующую запись, вставив в свой запрос длинную шестнадцатеричную строку из одной из этих ранее существующих записей:

select api_keys.* from api_keys where api_keys.api_key = 'long hex string';

тогда это не возвращает никаких результатов. Если я попробую это вместо этого:

select api_keys.* from api_keys where api_keys.api_key like 'long hex string';

Тогда я получаю совпадение.

Я создал индекс для api_keys.api_key, но это не имело никакого эффекта.

Эта проблема затрагивает еще одну модель в моем приложении, которая генерирует похожую строку случайных шестнадцатеричных цифр, используя вместо этого Digest :: SHA1 :: hexdigest.

Джеймс

Ответы на вопрос(2)

Ваш ответ на вопрос