Vi siete mai trovati nella situazione di avere delle tabelle nel vostro database MySQL contenenti dati inseriti dagli utenti non coerenti dal punto di vista del formato? Alcuni dati hanno solo le Iniziali Maiuscole (Title Case), altri sono totalmente MAIUSCOLI (UPPER CASE), altri ancora completamente minuscoli (lower case). Se avete la necessità di convertire tutto in maiuscolo o in minuscolo è sufficiente eseguire la seguente query:
UPDATE `table` SET `field` = UPPER(`field`)
(Per la conversione in minuscolo usare LOWER() invece di UPPER() ).
Tuttavia se volete convertire i dati in formato Title Case non c’è modo di farlo internamente dato che non esiste una funzione in MySQL che effettui questa conversione. Si potrebbe pensare, “E se dividessi la stringa in parole e convertissi in maiuscolo ognuna di esse usando SUBSTRING??”. Beh, nemmeno questa è una soluzione dato che non esiste in MySQL una funzione per spezzare le stringhe. Ci sono alcune soluzioni qui per dividere una stringa ed ottenere primo, secondo, terzo pezzo. Ma nessuna di queste funziona per convertire il formato di ogni parola, dato che non si può ciclare su tutte le parole.
Questa operazione può essere fatta in MySQL creando una Funzione definita dall’utente in C o C++. Questa soluzione è abbastanza complicata tanto più se non avete accesso completo al server MySQL.
Diversamente (correggetemi se sbaglio) dovete eseguire questa operazione effettuando una query sul vostro database con un linguaggio di programmazione ed aggiornando singolarmente ogni record. Segue uno script d’esempio in PHP.
$conn = mysql_connect($server, $username, $pass);
mysql_select_db ( $dbname );
$sql = ' SELECT `ID_item`, `name` FROM `items` WHERE (`name` REGEXP BINARY "^[a-z0-9 ]+$" OR `name` REGEXP BINARY "^[A-Z0-9 ]+$" ) ';
$result = mysql_query($sql, $conn);
echo '<table><thead><tr><td>Id</td>
<td>Old Name</td>
<td>New Name</td>
</tr>
</thead>
<tbody>';
while($row = mysql_fetch_array($result)){
$ID = $row["ID_item"];
$name = stripslashes($row["name"]);$newName = mb_convert_case($name, MB_CASE_TITLE, "utf-8");
echo "
<tr>
<td>$ID</td>
<td>$name</td>
<td>$newName</td>
</tr>
";
$sql2 = "UPDATE `items` SET `name` = '".addslashes($newName)."' WHERE `ID_item` = $ID ";
$result2 = mysql_query($sql2, $conn);
}
echo '</tbody>
</table>
';
Il codice precedente seleziona tutti i campi della tabella “items”, nella quale il campo “name” è totalmente maiuscolo o totalmente minuscolo (questo riduce il numero di risultati su cui lavorare nelle tabelle eccessivamente grandi). Se avete la necessità di controllare dei pattern più irregolari, come formato MISTO o FORmato mistO, potete adattare le espressioni regolari o semplicemente agire su tutti record della tabella.
La parte rimanente dello script cicla attraverso i risultati, stampa una tabella con l’ID dell’item, il vecchio nome ed il nome corretto (in modo da vedere direttamente i risultati) e aggiorna il campo. Il codice assume che il database sia in formato UTF-8.
Abbiamo scritto questo post soprattutto per mettervi a conoscenza del fatto che non esiste una soluzione in MySQL per convertire il Title Case, ovviamente il metodo PHP è molto semplice e potrete scrivere codice migliore di questo. Come sempre sentitevi liberi di inviarci qualsiasi correzione o integrazione!!