sql >> Databasteknik >  >> RDS >> Mysql

Hur matchar man en ip-adress i mysql?

Du kommer att behöva använda REGEXP för att matcha IP-adressens prickade quad-mönster.

SELECT *
FROM yourtable
WHERE 
  thecolumn REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$'

Tekniskt sett kommer detta att matcha värden som inte är giltiga IP-adresser, som 999.999.999.999 , men det kanske inte är viktigt. Vad är viktigt, är att fixa dina data så att IP-adresser lagras i sin egen kolumn separat från all annan data du har här. Det är nästan alltid en dålig idé att blanda datatyper i en kolumn.

mysql> SELECT '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+---------------------------------------------------------------------------+
| '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+---------------------------------------------------------------------------+
|                                                                         0 |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+------------------------------------------------------------------------------+
| '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+------------------------------------------------------------------------------+
|                                                                            1 |
+------------------------------------------------------------------------------+

En annan metod är att försöka konvertera IP-adressen till ett långt heltal via MySQL:s INET_ATON() funktion . En ogiltig adress returnerar NULL .

Denna metod är sannolikt mer effektiv än det reguljära uttrycket.

Du kan bädda in den i en WHERE villkor som:WHERE INET_ATON(thecolumn) IS NOT NULL

SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+

SELECT INET_ATON('notes');
+--------------------+
| INET_ATON('notes') |
+--------------------+
|               NULL |
+--------------------+

SELECT INET_ATON('56.99.9999.44');
+----------------------------+
| INET_ATON('56.99.9999.44') |
+----------------------------+
|                       NULL |
+----------------------------+


  1. Hur får man Doctrine TEXT-typ?

  2. Är det möjligt för SQL Output-sats att returnera en kolumn som inte infogas?

  3. Hur får man genomsnittliga träffar mellan aktuellt datum till postat datum i MySQL?

  4. MYSQL Konvertera tidsstämpel till månad