хранилище IP-адресов sqlite

#php #sqlite #timestamp #ip-address

#php #sqlite #временная метка #ip-адрес

Вопрос:

Я пытаюсь сохранить IP-адрес и идентификатор сеанса PHP, чтобы «однозначно» идентифицировать пользователя, управлять пользовательской очередью для управления (одним) аппаратным устройством через Интернет с помощью токена. Когда у пользователя есть токен, у него есть разрешение на управление устройством в течение X времени (2 минуты). Тогда мне также нужна временная метка, время, в течение которого пользователь запрашивал токен.

Я обнаружил проблемы с поиском правильного типа поля для IP-адреса и метки времени в SQLite.

Я работаю с PHP, поэтому было бы желательно найти простой способ получения очереди из базы данных, соответствующей «текстовому» идентификатору сеанса cookie и IP-адресу, используя временную метку для упорядочивания и фильтрации.

Какой лучший способ хранить их в базе данных SQLite?

Должен ли я использовать целое или текстовое поле? и есть ли функции для работы с этими типами?

Комментарии:

1. IP-адреса обычно хранятся как целое число. В PHP есть функция для их преобразования: php.net/manual/en/function.ip2long.php

2. @hakre — это будет работать только для IPv4.

3. Идентификатора сеанса должно быть достаточно для идентификации, php обрабатывает это за вас. Возможно, вы захотите сохранить ip-адрес для информационных целей, преобразуйте его в текстовую строку с помощью inet_ntop() .

Ответ №1:

SQLite — слабый тип, но поддерживает сходство типов. Вообще SQLite поддерживает только небольшой диапазон «типов столбцов» («сходства типов»)

 INTEGER
REAL
NUMERIC
TEXT
BLOB
NONE
  

Однако в вашем случае вы можете выбрать: вы можете сохранить временную метку как временную метку UNIX в INTEGER или как строку в формате datetime TEXT . См. Раздел «1.2 Тип данных даты и времени» в документе, предоставленном по ссылке выше. Существуют функции даты и времени, которые помогут вам обрабатывать такого рода данные.

IP-адрес может быть сохранен как INTEGER после преобразования его в единицу : ip2long() . Или вы тоже сохраняете его как TEXT . Я предлагаю использовать первое.

Обновление: если вы решите использовать INTEGER , вы будете ограничены хранением только адресов IPv4, потому что SQLite может хранить только 64-битные целые числа, тогда как IPv6 — 128 бит. Однако, поскольку ip2long работает только с IPv4, диапазон не является единственной проблемой.

Комментарии:

1. Это не то, что он спросил, очевидно, что все, кто использует sqlite, знают эти типы. Но он спросил, как сохранить IP-адрес, да, вы можете сохранить его как любой тип. Но это будет медленно.

2. Не путайте пролог с фактическим ответом: «IP-адрес может быть сохранен как ЦЕЛОЕ число после преобразования его в единицу: ip2long() . Или вы также сохраняете его как ТЕКСТ. Я предлагаю использовать первое. «. Однако можно утверждать, что я упустил из виду, что фактический вариант использования может быть более актуальным. Например, если вам нужен IP-адрес только для чтения и печати его где-нибудь (без индекса), текстовый формат более удобен без значительной потери производительности и без преобразования.