Ecco tre opzioni per restituire le righe che contengono caratteri maiuscoli in MySQL.
Dati di esempio
Supponiamo di avere una tabella con i seguenti dati:
SELECT c1 FROM t1;
Risultato:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
Possiamo usare i seguenti metodi per restituire le righe che contengono lettere maiuscole.
Opzione 1:confronta con LOWER()
Stringa
Possiamo usare il LOWER()
funzione per confrontare il valore originale con il suo equivalente minuscolo:
SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);
Risultato:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
Utilizzando il diverso a (<>
) operatore (puoi in alternativa usare !=
invece di <>
se preferisci), restituiamo solo quelle righe che sono diverse dai loro equivalenti minuscoli. Il motivo per cui lo facciamo è perché, se un valore è uguale al suo equivalente minuscolo, all'inizio era già minuscolo (e non vogliamo restituirlo).
Per impostazione predefinita, MySQL esegue una ricerca senza distinzione tra maiuscole e minuscole, quindi utilizzo CAST()
funzione per eseguire il cast dei valori in binario in modo da ottenere una ricerca con distinzione tra maiuscole e minuscole.
È anche possibile utilizzare il BINARY
per eseguire il cast del valore in binary, ma questo operatore è deprecato a partire da MySQL 8.0.27 e potrebbe essere rimosso in una versione futura.
In ogni caso, questo è l'aspetto del codice quando si utilizza il BINARY
operatore:
SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;
Può anche essere fatto in questo modo:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);
Ecco i risultati che ottengo da entrambi durante l'esecuzione del codice in MySQL 8.0.27:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+ 8 rows in set, 2 warnings (0.00 sec)
E quando mostro gli avvisi:
SHOW WARNINGS;
Risultato:
+---------+------+----------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------------------------------+ | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | +---------+------+----------------------------------------------------------------------------------------------+
Opzione 2:confronta con i caratteri reali
Un'altra opzione è usare il REGEXP
operatore con un modello di espressione regolare che include esplicitamente ogni carattere maiuscolo che vogliamo abbinare:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);
Risultato:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+
Questa volta vengono restituite meno righe rispetto agli esempi precedenti. Questo perché non ho specificato caratteri come É
e Ø
, che sono stati restituiti in quegli esempi. Il nostro risultato contiene É
ma quella riga è stata restituita solo perché contiene anche altri caratteri maiuscoli che fa corrispondenza.
Pertanto, se utilizzi questa opzione, dovrai assicurarti di aver coperto tutti i caratteri validi.
Opzione 3:confronta con un intervallo di caratteri
Un altro modo per farlo è specificare l'intervallo di caratteri maiuscoli che vogliamo abbinare:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);
Risultato:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+