Meine OpenCart
Tabellenkollation ist utf8_bin
, leider kann ich nicht nach Produktnamen mit Akzent im Namen suchen. Ich habe auf Google gesucht und festgestellt, dass die Sortierung für die akzentkompatible und die Groß- und Kleinschreibung nicht relevante Suche utf8_general_ci
sein muss.
Was passiert, wenn ich der Suchanfrage eine Sortiererklärung hinzufüge?
%Vor%Hat es irgendwelche (schlechten) Nebenwirkungen? Ich habe Probleme mit Indexierung, Leistung? Oder ist es völlig sicher?
Ich fürchte, Sie müssen die Nebenwirkungen der Abfrageleistung berücksichtigen, insbesondere diejenigen, die Indizes verwenden. Hier ist ein einfacher Test:
%Vor%Sie können sehen, dass MySQL den Index für a1 nicht mehr verwendet, wenn Sie es mit einer anderen Sortierung suchen, was für Sie ein großes Problem darstellen kann.
Um sicherzustellen, dass Ihre Indizes für Abfragen verwendet werden, müssen Sie möglicherweise die Spaltensortierung in die am häufigsten verwendete Spalte ändern.
In Verwendung von COLLATE in SQL-Anweisungen finde ich nicht Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Wie auch immer, um deine Hauptfrage der Auswirkungen von Kollationen zu erklären, habe ich einige Tipps gefunden, aber zuerst:
Von dev.mysql.com :
Nonbinary-Zeichenfolgen (wie in den Datentypen
CHAR
,VARCHAR
undTEXT
gespeichert) haben einen Zeichensatz und eine Sortierung. Ein gegebener Zeichensatz kann mehrere Sortierfolgen haben, von denen jede eine bestimmte Sortierung und Vergleichsreihenfolge für die Zeichen in der Menge definiert.
Bei mehreren Operanden kann es Mehrdeutigkeiten geben. Zum Beispiel:
%Vor% Soll der Vergleich die Sortierung der Spalte x
oder des Stringliterals 'Y'
verwenden? Sowohl x
als auch 'Y'
haben Kollatierungen. Welche Kollatierung hat also Vorrang?
Standard-SQL löst solche Fragen mit den sogenannten "coercibility" Regeln. [3]
ORDER BY
- [auch in WHERE
] - INDEX
; daher könnte es überraschend ineffizient sein. [4]
utf8_general_ci
bei Vergleichen schneller als% ausgeführt wird) co_de% aufgrund der zusätzlichen Lookups / Berechnung erforderlich). Wenn möglich, ändern Sie die Spaltendefinition (en).
%Vor%(Sie sollten alles weitere einschließen, das bereits in der Spaltendefinition enthalten war.) Wenn Sie mehrere zu ändernde Spalten haben, führen Sie alle im selben ALTER (für Geschwindigkeit) aus.
Wenn Sie aus irgendeinem Grund ALTER
nicht ausführen können, können Sie die SELECT
anpassen, um die Sortierung zu ändern:
Die von Ihnen erwähnte SELECT
hatte keine WHERE
-Klausel zum Filtern, also lassen Sie mich den Testfall ändern:
Nehmen wir an, Sie haben das, was nur "San Jose" finden wird:
%Vor% Um San José
einzufügen:
Wenn Sie "Akzente kombinieren" haben, sollten Sie utf8_unicode_ci verwenden. Weitere Informationen zur Kombination von Diakritikern und Mehr zu Ihrem Thema .
Was Nebenwirkungen angeht? Keine außer bei potenziell großen: Der Index für die Spalte kann nicht verwendet werden. In meinem zweiten SELECT
(oben) ist INDEX(city)
nutzlos. Die ALTER
vermeidet diese Leistungseinbuße für SELECT
, aber die einmalige ALTER
selbst ist teuer.
Dies könnte helfen: UTF-8: Allgemein? Behälter? Unicode?
Bitte beachten Sie, dass utf8_bin
ebenfalls zwischen Groß- und Kleinschreibung unterscheidet. Ich würde also die Tabellenkollation auf utf8_general_ci
ändern und für die Zukunft sorgen.