Я искал то же самое, и вместо того, чтобы в конечном итоге делает это - но оставаясь в MySQL:
- Установка этого udf library в MySQL, потому что я хотел силу PCRE.
используя эту инструкцию
case when version is null then null
when '' then 0
else
preg_replace('/[^.]*([^.]{10})[.]+/', '$1',
preg_replace('/([^".,\\/_()-]+)([".,\\/_()-]*)/','000000000$1.',
preg_replace('/(?<=[0-9])([^".,\\/_()0-9-]+)/','.!$1',version
)))
end
Я сломаться, что это значит:
preg_replace
является функцией, что библиотека UDF создана.Потому что это UDF, вы можете просто вызвать из любого пользователя или пространства базы, как тот
^".,\\/_()
прямо сейчас я рассматриваю все эти символы в качестве разделителей или традиционных «точек» в версии
preg_replace('/(?<=[0-9])([^".,\\/_()0-9-]+)/','.!$1',version)
означает заменить все не - «точки» и не номера, которым предшествует число, которому предшествует «точка» и восклицательный знак.
preg_replace('/([^".,\\/_()-]+)([".,\\/_()-]*)/','000000000$1.', ...)
означает дополнительно заменить все «точки» фактическими точками и заполнить все цифры с помощью 9 нулей. Также любые смежные точки будут уменьшены до 1.
preg_replace('/0*([^.]{10})[.]+/', '$1', ...)
означает, что дополнительно блокировать все числовые блоки до 10 цифр и сохранять как можно больше блоков. Я хотел заставить 6 блоков сохранить его под 64-байтами, но 7 блоков были на удивление распространены и, следовательно, были необходимы для моей точности. Также необходимы блоки из 10, поэтому 7 блоков из 9 не были вариантом. Но переменная длина работает хорошо для меня. - помните строки сравниваются слева направо
Так что теперь я могу справиться с версией как:
1.2 < 1.10
1.2b < 1.2.0
1.2a < 1.2b
1.2 = 1.2.0
1.020 = 1.20
11.1.1.3.0.100806.0408.000 < 11.1.1.3.0.100806.0408.001
5.03.2600.2180 (xpsp_sp2_rtm.040803-2158)
A.B.C.D = a.B.C.D
A.A < A.B
Я выбрал восклицательный знак, потому что он сортирует в последовательностях Collations (что я использую в любом случае) перед 0. Это относительная сортировка 0 позволяет использовать буквы, такие как b и a, когда они используются сразу же рядом с числом выше, чтобы обрабатываться как новый раздел и быть сортировкой до 0 - это заполнение, которое я использую.
Я использую 0 в качестве дополнения, так что ошибки поставщика, такие как перемещение с фиксированного 3-значного блока на переменную, не укусят меня.
Вы можете легко выбрать дополнительное дополнение, если хотите обрабатывать глупые версии, такие как «2.11.0 В стадии разработки (неустойчивый) (2010-03-09)» - строка development
составляет 11 байт.
Вы можете запросить дополнительные блоки в окончательной замене.
Я мог бы сделать больше, но я старался сделать как можно меньше шагов с высокой степенью точности, так как у меня есть несколько миллионов записей для сканирования регулярно. Если кто-нибудь увидит оптимизацию, пожалуйста, repsond.
Я решил сохранить его в виде строки, а не вставить в число, потому что у литья есть стоимость, а также буквы важны, как мы видели. Одна вещь, о которой я думал, - это тест на строку и возврат опции, которая не так много, или менее дорогая функция для более аккуратных случаев. 11.1.1.3
- очень распространенный формат
Вот почему вы должны хранить строки как строки и цифры в виде чисел – zerkms
. Номера версий всегда содержат 3 группы чисел? –
@Salman: Нет Мне, возможно, придется сравнивать 4.2 и 4.2.1 – Eric