23 Stimmen

Was ist der Vorteil der Verwendung von varbinary gegenüber varchar?

Vor einiger Zeit habe ich eine Frage zur Sortierung von Hierarchie-/Versionsnummern in SQL Server gestellt. ( Wie kann ich eine Spalte "Versionsnummer" mit einer SQL Server-Abfrage allgemein sortieren? ).

Zu den eingereichten Antworten gehörten dieser Link zu einer TSQL Coding Challenge mit dem gleichen Rätsel .

In der SQL2000-Lösung demonstrierte der Autor zwei Varianten, von denen eine varchar und die andere varbinary verwendet und zurückgibt. Der Autor erklärt, WAS er tut, ohne zu erklären, WARUM er dies tut.

Meine Frage ist also, welche Hauptunterschiede/Vorteile (wenn überhaupt) sich aus den unterschiedlichen Ansätzen ergeben? D.h., warum eine varbinary anstelle einer varchar verwenden?

Ich habe darauf verzichtet, den Code zu posten, da er in dem oben genannten Artikel am elegantesten zusammengefasst ist.

19voto

Damien_The_Unbeliever Punkte 227101

Ich glaube, die Erwartung ist, dass die varbinary Daten in der Regel weniger Bytes (5), als die varchar ein (10 oder 11, ich glaube) pro Teil der ursprünglichen Zeichenfolge verbrauchen, und so, für sehr große Anzahl von Komponenten oder Vergleiche auftreten, sollte es effizienter sein.

Aber ich würde empfehlen, dass Sie, wenn Sie eine der beiden Lösungen verwenden möchten, beide implementieren (sie sind recht kurz), und versuchen Sie einige Profilerstellung gegen Ihre realen Daten (und Abfragemuster), um zu sehen, ob es praktische Unterschiede gibt (ich würde nicht so erwarten).

(Crafty Steal): Und wie Martin betont, werden die binären Vergleiche effizienter sein, da sie nicht den ganzen Code benötigen, der für die Sortierung zuständig ist :-)

6voto

sudip Punkte 2610

Wenn wir verschiedene Sortierreihen für verschiedene varchar-Spalten verwenden, um Zeichenketten zu speichern, und mehr als eine solche Spalte in einer SQL-Abfrage verwenden, dann kann die SQL-Abfrage den Fehler "Ungültige Mischung von Sortierreihen" auslösen. (z.B. wenn wir zwei Strings mit inkompatibler Sortierung vergleichen wollen oder versuchen, Daten mit unterschiedlicher Sortierung in einer kombinierten Spalte auszuwählen).

Aber das kann behoben werden, wenn wir "COLLATE" in der Abfrage angeben. Zum Beispiel :

 WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_ci 

Aber das macht jeden INDEX zunichte, den Sie vielleicht haben.

Um die Fehlermeldung "Ungültige Kombination von Sortierreihen" zu vermeiden, können wir varbinary verwenden.

varbinary benötigt weniger Platz als varchar, wenn für die varchar-Spalte eine Multi-Byte-Sortierung verwendet wird. (Binäre Zeichenfolgen haben keine Zeichensätze und Sortierreihenfolgen. Binäre Zeichenketten sind lediglich eine Folge von Byte-Werten).

*** Ein Zeichensatz ist eine Menge von Symbolen und Kodierungen. Eine Kollation ist ein Satz von Regeln für den Vergleich von Zeichen in einem Zeichensatz https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

Wenn Sie jedoch einen Ein-Byte-Zeichensatz (z. B. latin1) anstelle eines Multi-Byte-Zeichensatzes (z. B. utf8 oder ucs2) wählen, dann ist der Platzbedarf für varbinary und varchar gleich.

VARBINARY ist besser als VARCHAR, wenn es keine Gültigkeitsprüfung gibt. Wenn zum Beispiel der Standardzeichensatz UTF8 ist, ist dies illegal:

CREATE TABLE t9 (s1 VARCHAR(5));
INSERT INTO t9 VALUES (0xF4808283);

Dies ist jedoch legal, da der Zeichensatz keine Rolle spielt:

CREATE TABLE t10 (s1 VARBINARY(5));
INSERT INTO t10 VALUES (0xF4808283);

VARCHAR vergleicht also Zeichen unter Verwendung einer "Sortierung" und VARBINARY vergleicht Bytes. Die meisten Sortierverfahren unterscheiden nicht zwischen Groß- und Kleinschreibung, so dass Groß- und Kleinbuchstaben als gleichwertig betrachtet werden. Da varbinary keine Sortierreihenfolge verwendet, wird bei den Suchoperationen im Falle von varbinary immer die Groß- und Kleinschreibung berücksichtigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X