sql >> Databáze >  >> RDS >> Mysql

Jak porovnat řetězec verze (x.y.z) v MySQL?

Pokud všechna vaše čísla verzí vypadají jako některé z těchto:

X
X.X
X.X.X
X.X.X.X

kde X je celé číslo od 0 do 255 (včetně), pak můžete použít INET_ATON() funkce pro transformaci řetězců na celá čísla vhodná pro srovnání.

Před použitím funkce se však musíte ujistit, že argument funkce je X.X.X.X formuláře připojením potřebného množství '.0' k tomu. Chcete-li to provést, musíte nejprve zjistit, kolik je . 's řetězec již obsahuje, což lze provést takto:

CHAR_LENGTH(ver) - CHAR_LENGTH(REPLACE(ver, '.', '')

To znamená, že počet teček v řetězci je délka řetězce mínus jeho délka po odstranění teček.

Získaný výsledek by měl být poté odečten od 3 a spolu s '.0' , předán do REPEAT() funkce:

REPEAT('.0', 3 - CHAR_LENGTH(ver) + CHAR_LENGTH(REPLACE(ver, '.', ''))

Tím získáme podřetězec, který musí být připojen k původnímu ver hodnotu, aby odpovídala X.X.X.X formát. Takže to bude zase předáno CONCAT() fungovat spolu s ver . A výsledek toho CONCAT() lze nyní přímo předat INET_ATON() . Takže tady je to, co nakonec dostaneme:

INET_ATON(
  CONCAT(
    ver,
    REPEAT(
      '.0',
      3 - CHAR_LENGTH(ver) + CHAR_LENGTH(REPLACE(ver, '.', ''))
    )
  )
)

A to jen za jednu hodnotu! :) Podobný výraz by měl být vytvořen pro druhý řetězec, poté můžete porovnat výsledky.

Reference:



  1. Funkce zabezpečení Spotlight Cloud – Odstraňte literály

  2. Vyberte nejlepší odlišné výsledky seřazené podle frekvence

  3. Proč jádro MyISAM MySQL nepodporuje cizí klíče?

  4. Zpracování latence v transakcích MySQL