Имя поля Mysql в регулярном выражении

То, что делает Вас, подразумевает под высокой производительностью? Если Вы хотите сериализацию миллисекунды, я предлагаю, чтобы Вы использовали подход сериализации, который является самым простым. Если Вы захотите sub миллисекунду, то Вам, вероятно, будет нужен двоичный формат. Если Вы захотите много ниже 10 микросекунд, то Вам, вероятно, будет нужна пользовательская сериализация.

я не видел много сравнительных тестов для сериализации/десериализации, но немногие поддерживают меньше что 200 микросекунд для сериализации/десериализации.

Независимые от платформы форматы прибывают в стоимость (в усилии с Вашей стороны и задержке), Вам, вероятно, придется решить, хотите ли Вы производительность или независимость от платформы. Однако нет никакой причины, у Вас не может быть обоих как параметра конфигурации, между которым Вы переключаетесь как требуется.

6
задан OMG Ponies 22 September 2009 в 15:58
поделиться

3 ответа

Возможно, вы захотите сохранить IP-адрес как INT UNSIGNED. Также сохраните сетевую маску, чтобы вы могли отличить статический адрес от подсети.

INSERT INTO bots (ipaddress, netmask, bot_name) 
VALUES (INET_ATOI('192.168.1.0'), INET_ATOI('255.255.255.0'), 'Wall-E');

Затем вы можете запросить, соответствует ли входной IP-адрес:

SELECT bot_name
FROM bots
WHERE __input_ip__ & netmask = ipaddress & netmask;

Использование целых чисел для IP-адресов вместо CHAR (15) - это общая оптимизация. Даже хранение 8 байтов для IP-адреса и сетевой маски - это немногим больше половины объема хранения CHAR (15). И побитовые операции, вероятно, будут намного быстрее, чем сопоставление регулярных выражений, и легче избежать угловых случаев, как в комментарии @ Gumbo.

4
ответ дан 11 December 2019 в 00:40
поделиться

Попробуйте следующее:

SELECT bot_name
FROM bots
WHERE __input_ip__  REGEXP concat('^', replace(ip_address, '.', '\.'))
2
ответ дан 11 December 2019 в 00:40
поделиться

(Это ответ на ответ Эндрю, но не вписывается в комментарий.)

WHERE __input_ip__  REGEXP concat('^', replace(ip_address, '.', '\.'))

Хороший план, за исключением того, что в MySQL \ - это экранирование строкового литерала (нестандартного SQL), поэтому, чтобы получить его в регулярном выражении, вам, вероятно, потребуется '\\\.' !

... кроме режима ANSI это не будет. Ах! Чтобы быть совместимым, вам нужно получить обратную косую черту другим способом:

WHERE __input_ip__ REGEXP CONCAT('^', REPLACE(ip_address, '.', CHAR(92, 46)))

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

WHERE LEFT(__input_ip__, CHAR_LENGTH(ip_address))=__input_ip__
1
ответ дан 11 December 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: