Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Länge() vs. char_length()

In MySQL gibt es viele Male, wo die length() Funktion und die char_length() Funktion liefert genau die gleichen Ergebnisse. Es gibt jedoch auch Zeiten, in denen die Ergebnisse völlig unterschiedlich sein werden. Hier ist der Grund.

Hier ist zunächst die Definition für jede dieser Funktionen:

char_length()
Gibt die Länge eines Strings zurück, gemessen in Zeichen.
length()
Gibt die Länge eines Strings zurück, gemessen in Bytes.

Beachten Sie „Zeichen“ im Vergleich zu „Bytes“ – man wird in Zeichen gemessen , der andere wird in Bytes gemessen .

In vielen Fällen entspricht die Anzahl der Bytes der Anzahl der Zeichen in der Zeichenfolge, aber das ist nicht immer der Fall. Die Anzahl der pro Zeichen verwendeten Bytes hängt davon ab, wie die Daten gespeichert werden. Wenn die Zeichenkette beispielsweise als Unicode-Daten gespeichert wird, gibt es 2 Bytes pro Zeichen.

Hier ist ein einfaches Beispiel mit ASCII-Text (wobei beide Funktionen das gleiche Ergebnis zurückgeben):

SELECT 
    CHAR_LENGTH('Lit'), 
    LENGTH('Lit');

Ergebnis:

+--------------------+---------------+
| CHAR_LENGTH('Lit') | LENGTH('Lit') |
+--------------------+---------------+
|                  3 |             3 |
+--------------------+---------------+

Und oft erhalten wir dasselbe Ergebnis, wenn der String in einer Datenbank gespeichert ist:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Ergebnis:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  3 |
+-------------------------+--------------------+

Wenn wir jedoch die Datenbankspalte ändern, um die Daten als Unicode zu speichern:

ALTER TABLE Artists 
MODIFY COLUMN ArtistName VARCHAR(255) unicode;

Führen Sie dann dieselbe Abfrage erneut aus:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Wir erhalten ein anderes Ergebnis:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  6 |
+-------------------------+--------------------+

Dies liegt daran, dass Unicode jedes Zeichen als 2 Bytes speichert.

Dies ähnelt dem Unterschied zwischen datalength() und len() in T-SQL.

MySQL hat auch die octet_length() Funktion, die ein Synonym für length() ist .