que tenían una mirada más cercana en las páginas doc MySQL, y me encontré un puesto de ahí que se adapte a sus necesidades:
SELECT '10.0.0.1' AS IP0,
(SUBSTRING_INDEX('10.0.0.1', '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.0.1', '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.0.1', '.', -2),'.',1) * 256 +
SUBSTRING_INDEX('10.0.0.1', '.', -1)
),
'10.0.255.1' AS IP1,
(SUBSTRING_INDEX('10.0.255.1', '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.255.1', '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX('10.0.255.1', '.', -2),'.',1) * 256 +
SUBSTRING_INDEX('10.0.255.1', '.', -1)
) AS IP2Num1
Devuelve un valor numérico para cada IP:
Ip: | 10.0.0.1 | 10.0.255.1 |
--------------------------------
Num: | 167772161 | 167837441 |
En otra palabras:
SELECT foo
FROM bar.foobar
WHERE (SUBSTRING_INDEX(ipField, '.', 1) * 16777216 +
SUBSTRING_INDEX(SUBSTRING_INDEX(ipField, '.', 2),'.',-1) * 65536 +
SUBSTRING_INDEX(SUBSTRING_INDEX(ipField, '.', -2),'.',1) * 256 +
SUBSTRING_INDEX(ipField, '.', -1)
) BETWEEN 167772161 AND 167837441;
Bueno, podría hace esto:
WHERE ipField LIKE '10.0.%.1'
AND (CAST
(REPLACE(SUBSTRING_INDEX(ipField,'.',3),
CONCAT(SUBSTRING_INDEX(ipField ,'.',2),'.')
,'')
AS UNSIGNED) BETWEEN 0 AND 255)
Qué he probado con la siguiente consulta:
SELECT IF ('10.0.12.1' LIKE '10.0.%.1'
AND (CAST
(REPLACE(SUBSTRING_INDEX('10.0.12.1','.',3),
CONCAT(SUBSTRING_INDEX('10.0.12.1','.',2),'.')
,'')
AS UNSIGNED) BETWEEN 0 AND 255),
TRUE,
FALSE);
y vuelve 1
, pero, honestamente, eso es un poco de un faff, no es ¿eso? ¿Por qué no simplemente:
WHERE ipField REGEXP '10\\.0\\.[0-9]{1,3}\\.1'
Se pueden ajustar esta expresión un poco, pero básicamente, que me parece ser la forma más sencilla de interrogar a esas direcciones IP.
Para obtener más información sobre las funciones de cadena de MySQL (que casi siempre serán difíciles de escribir), consulte the docs here
¿por qué almacena los valores con%? –
Utilice un número mayor que 255 (como '350') y reemplácelo con un comodín en php? – hjpotter92
¿Cómo quieres usar tu comodín? ¿Sería 10.0.1% .1 y 10.% considerados válidos también? – Josay