sql >> Database >  >> RDS >> Mysql

mysql komt graag overeen met het volledige woord of het begin van het woord op string

Zoals reeds vermeld in de vraag de vraag

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

werkt voor het matchen van records waarbij het SEARCHFIELD bevat een woord dat begint met (of gelijk is aan) $searchText

Wat betreft prestaties heb ik een test gedaan op mijn ontwikkelmachine MBP 2,2 GHz i7 quad core :

Zoeken naar een woord op 4.000 records duurt ongeveer 40 milliseconden.

Records worden normaal gesproken geïndexeerd (geen fulltext).

Ik heb een paar duizenden records en de query wordt niet vaak uitgevoerd, dus voor mij is het goed.
De oplossing is mogelijk niet geschikt voor andere contexten.

Om een ​​voorbereid statement op te bouwen met de bovenstaande query heb ik de hier beschreven techniek gebruikt:

MySQL-wildcards ontsnappen

De resulterende code is als volgt:

function like($s, $e)
{
    return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}

/* ... */

/* create a prepared statement */
$stmt = $mysqli->prepare(
    'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
); 

if( $stmt )
{
    /* escape the text */
    $escSearchText = like( $searchText, "=" );

    /* 'like' parameters */
    $like1 = $escSearchText . "%";
    $like2 = "%" . $escSearchText . "%";

    /* bind parameters for markers */
    $stmt->bind_param( "ss", $like1, $like2 );

/* ... */


  1. Wat is het MySQL-equivalent van STUFF() in SQL Server?

  2. Een lange tekenreeks invoegen in CLOB-gegevenstype in Oracle

  3. Hoe de gegevens in unicode in hindi-taal op te slaan?

  4. Opgeslagen procedure EXEC vs sp_executesql verschil?