Frage

Ich weiß, dass CHAR wird empfohlen, wenn alle meine Werte mit fester Breite sind. Na und? Warum nicht nur VARCHAR für alle Textfelder wählen Sie einfach, sicher zu sein.

War es hilfreich?

Lösung

Pick Allgemein CHAR , wenn alle Reihen in der Nähe haben, werden die gleiche Länge . Wählen Sie VARCHAR , wenn die Länge variiert deutlich. CHAR kann auch ein bisschen schneller sein, weil alle Zeilen von gleicher Länge sind.

Sie variiert von DB Umsetzung, aber im Allgemeinen VARCHAR verwendet ein oder zwei weitere Bytes Speicherplatz (zum Länge oder Beendigung) zusätzlich zu den eigentlichen Daten. So (vorausgesetzt, Sie verwenden einen Ein-Byte-Zeichensatz) Speichern des Wortes „FooBar“

  • CHAR (6) = 6 Bytes (kein Overhead)
  • VARCHAR (10) = 8 Byte (2 Byte Overhead)
  • CHAR (10) = 10 Bytes (4 Bytes Overhead)

Unterm Strich ist CHAR kann sein schneller und platzspar für Daten von relativ gleicher Länge (innerhalb von zwei Längendifferenz Zeichen).

Hinweis : Microsoft SQL verfügt über 2 Byte Overhead für eine VARCHAR. Der von der DB zu DB kann variieren, aber im Allgemeinen gibt es mindestens 1 Byte Overhead benötigte Länge oder EOL auf einem VARCHAR anzuzeigen.

Wie von Gaven in den Kommentaren darauf hingewiesen, wenn Sie ein Multi-Byte verwenden, setzen variabler Länge Zeichen wie UTF8 dann CHAR speichert die maximale Anzahl von Bytes notwendig, die Anzahl von Zeichen zu speichern. Also, wenn UTF8 höchstens 3 Bytes benötigt ein Zeichen zu speichern, dann CHAR (6) wird auf 18 Byte festgelegt werden, auch wenn nur latin1 Zeichen zu speichern. Also in diesem Fall VARCHAR wird eine viel bessere Wahl.

Andere Tipps

Wenn Sie mit mir arbeiten und Sie arbeiten mit Oracle, würde ich wahrscheinlich Sie in fast jedem Umstand nutzen varchar machen. Die Annahme, dass char verbraucht weniger Rechenleistung als varchar kann wahr sein ... jetzt ... aber Datenbank-Engines besser im Laufe der Zeit und diese Art der Regel hat die Herstellung eines zukünftigen „Mythos“.

Eine andere Sache: Ich habe noch nie ein Leistungsproblem, weil jemand beschlossen zu gehen mit varchar gesehen. Sie werden viel bessere Nutzung Ihrer Zeit guten Code (weniger Anrufe in die Datenbank) und effizienten SQL Schreiben machen (wie Indizes arbeiten, wie funktioniert der Optimierer Entscheidungen treffen, warum ist exists schneller als in in der Regel ...).

letzter Gedanke: Ich habe alle möglichen Probleme mit der Verwendung von CHAR gesehen, Menschen auf der Suche nach ‚‘ ‚wenn sie suchen sollen‘, oder Leute für ‚FOO‘ suchen, wenn sie sollten für ‚FOO suchen (Haufen hier Leerzeichen)‘, oder die Leute nicht die nachfolgenden Leerzeichen Trimmen oder Bugs mit Powerbuilder auf den Wert bis zu 2000 Rohlinge Hinzufügen es aus einer Oracle-Prozedur gibt.

Neben Leistungsvorteilen, CHAR verwendet werden kann, um anzuzeigen, dass alle Werte sollte gleich lang sein, beispielsweise eine Spalte für die US-Staat Abkürzungen.

Char ist ein wenig schneller, wenn Sie also eine Spalte, die Sie wissen, dass eine bestimmte Länge, char verwenden. Zum Beispiel Speicher (M) ale / (F) emale / (U) für Nknown Geschlecht oder 2 Zeichen für einen US-Zustand.

Hat NChar oder Char besser abschneiden, dass ihre var Alternativen?

Gute Frage. Die einfache Antwort ist ja in bestimmten Situationen. Mal sehen, ob dies erklärt werden kann.

Natürlich sind wir alle wissen, dass, wenn ich eine Tabelle mit einer Spalte von Varchar (255) erstellen (lassen Sie uns diese Spalte MyColumn nennen) und eine Million Zeilen einfügen, sondern nur ein paar Zeichen in MyColumn für jede Zeile setzen, wird die Tabelle viel sein kleine (Gesamtanzahl der Datenseiten von der Speicher-Engine erforderlich), als wenn ich myColumn als char erstellt hatte (255). Immer wenn ich eine Operation (DML) auf die Tabelle und Anforderung eine Menge von Zeilen, wird es schneller sein, wenn MyColumn varchar ist, weil ich nicht haben Bewegung um all diese „extra“ Leerzeichen am Ende . Bewegen, wie in, wenn SQL Server tun interne Sorten wie zum Beispiel während einer bestimmten oder Vereinigungsoperation, oder wenn es eine Zusammenführung wählt während es Abfrage-Plan ist, usw. verschiebt auch die Zeit bedeuten könnte er die Daten vom Server auf meinem lokalen zu bekommen nimmt PC oder an einem anderen Computer oder wo auch immer es wird verzehrt werden.

Aber es gibt einige Overhead bei der Verwendung varchar. SQL Server verfügt über eine Zwei-Byte-Anzeige (Overhead) zu, in jeder Zeile zu verwenden, um zu wissen, wie viele Bytes, die bestimmten Zeile des MyColumn in ihm hat. Es ist nicht die zusätzlichen 2 Byte, die das Problem darstellt, ist es die mit der Länge der Daten in MyColumn auf jeder Zeile zu „decode“.

In meinen Erfahrungen macht es am meisten Sinn char zu verwenden anstelle von varchar auf Spalten, die in Abfragen verbunden werden. Zum Beispiel des Primärschlüssel einer Tabelle oder eine andere Spalte, die indiziert werden. Kundennummer auf einer demographische Tabelle oder CodeID auf einer Decodierungstabelle, oder vielleicht Auftragsnummer auf einer Auftragstabelle. Durch die Verwendung von Zeichen kann die Abfrage-Engine schneller ausführen die Verbindung, weil es gerade Pointer-Arithmetik tun können (deterministisch), anstatt es Zeiger eine variable Menge von Bytes zu bewegen, wie es die Seiten liest. Ich weiß, ich habe dich auf diesem letzten Satz verloren könnte. Schließt sich in SQL Server um die Idee der Basis „Prädikate.“ Ein Prädikat ist eine Bedingung. Zum Beispiel MyColumn = 1, oder Auftragsnummer <500.

Also, wenn SQL Server eine DML-Anweisung durchgeführt wird, und die Prädikate oder „Schlüssel“ verbunden sind, auf eine feste Länge (char) sind, die Abfrage-Engine haben nicht so viel Arbeit zu tun, Zeilen aus einer Tabelle entsprechen In den Reihen aus einer anderen Tabelle. Es muss nicht herausfinden, wie lange die Daten in der Zeile und dann zu Fuß der Zeichenfolge an das Ende zu finden. Alles, was Zeit in Anspruch nimmt.

Jetzt beachten kann dies leicht schlecht umgesetzt werden. Ich habe Zeichen für Primärschlüsselfelder in Online-Systemen verwendet gesehen. Die Breite muss klein heißt char (15) oder etwas vernünftig gehalten werden. Und es funktioniert am besten in Online-Systemen, weil Sie in der Regel nur abrufen oder eine kleine Anzahl von Zeilen upserting, so zu müssen „rtrim“ dies Leerzeichen Sie in der Ergebnismenge bekommen ist eine triviale Aufgabe im Gegensatz zu mit Millionen beizutreten Zeilen aus einer Tabelle zu Millionen von Zeilen auf einer anderen Tabelle.

Ein weiterer Grund CHAR Sinn über varchar auf Online-Systemen macht, ist, dass es Seitenteilungen reduziert. Durch die Verwendung von Zeichen, Sie sind im Wesentlichen „Reservierung“ (und verschwenden), dass der Raum so, wenn ein Benutzer entlang später kommt und mehr Daten in dieser Spalte SQL setzt bereits Platz für zugeordnet und in ihm geht.

Ein weiterer Grund CHAR zu verwenden ist ähnlich den zweiten Grund. Wenn ein Programmierer oder Benutzer eine „Batch“ Update auf Millionen von Zeilen der Fall ist, zum Beispiel einige Satz zu einer Notiz Feld hinzufügen, werden Sie nicht einen Anruf von Ihrem DBA in der Mitte der Nacht fragen, warum ihre Laufwerke voll sind. Mit anderen Worten, es führt zu berechenbarem Wachstum der Größe einer Datenbank.

Das sind also drei Möglichkeiten, ein Online (OLTP) System kann von char über varchar profitieren. Ich je kaum char in einem Lager / Analyse / OLAP-Szenario verwenden, da Sie in der Regel so viel Daten haben gezeigt, dass alle diese Zeichen Spalten zu viel Platz verschwendet hinzufügen können.

Beachten Sie, dass char Ihre machen kannDatenbank viel größer, aber die meisten Backup-Tools haben die Datenkompression, so dass Ihre Backups sind in der Regel etwa die gleiche Größe sein, als ob Sie varchar verwendet hatte. Zum Beispiel Litespeed oder RedGate SQL Backup.

Eine weitere Anwendung ist in Ansichten für den Export von Daten in eine feste Breite-Datei erstellt. Lassen Sie uns sagen, dass ich einige Daten in eine flache Datei, die von einem Mainframe zu lesen zu exportieren haben. Es ist festgelegte Breite (nicht begrenzt). Ich mag die Daten zu speichern, in meiner „staging“ Tabelle als varchar (also weniger Platz auf meiner Datenbank raubend) und dann eine Ansicht verwenden, um alles zu gösse es char äquivalent ist, mit der Länge für die Spalte mit der Breite der festen Breite entspricht . Zum Beispiel:

create table tblStagingTable (
pkID BIGINT (IDENTITY,1,1),
CustomerFirstName varchar(30),
CustomerLastName varchar(30),
CustomerCityStateZip varchar(100),
CustomerCurrentBalance money )

insert into tblStagingTable
(CustomerFirstName,CustomerLastName, CustomerCityStateZip) ('Joe','Blow','123 Main St Washington, MD 12345', 123.45)

create view vwStagingTable AS
SELECT CustomerFirstName = CAST(CustomerFirstName as CHAR(30)),
CustomerLastName = CAST(CustomerLastName as CHAR(30)),
CustomerCityStateZip = CAST(CustomerCityStateZip as CHAR(100)),
CustomerCurrentBalance = CAST(CAST(CustomerCurrentBalance as NUMERIC(9,2)) AS CHAR(10))

SELECT * from vwStagingTable

Das ist cool, weil intern meine Daten weniger Platz in Anspruch nehmen, weil es varchar ist verwenden. Aber wenn ich DTS oder SSIS verwenden oder auch nur ein Ausschneiden und Einfügen von SSMS Notepad, kann ich die Ansicht verwenden und die richtige Anzahl von Leerzeichen am Ende bekommen. In DTS haben wir eine Funktion namens haben, verdammt ich vergessen, dass ich glaube, es hieß „vorschlagen Spalten“ oder so ähnlich. In SSIS können Sie nicht tun, mehr, Sie müssen mühsam den Flat-File-Verbindungs-Manager definieren. Aber da Sie die Ansicht Setup haben, können SSIS die Breite jeder Spalte kennen und es kann viel Zeit sparen, wenn Sie Ihre Datenfluss Aufgaben zu bauen.

Unterm Strich also ... Verwendung varchar. Es gibt eine sehr kleine Anzahl von Gründen char zu verwenden und es ist nur aus Leistungsgründen. Wenn Sie ein System mit hundrends von Millionen von Zeilen haben Sie einen spürbaren Unterschied sehen, ob die Prädikate deterministisch sind (char), aber für die meisten Systeme mit char einfach verschwendet Platz.

Ich hoffe, das hilft. Jeff

Es gibt Performance-Vorteile, aber hier ist eine, die nicht erwähnt wurde: row Migration. Mit char Sie den gesamten Raum in advance.So behalten wir uns sagt, Sie haben einen char (1000), und Sie speichern 10 Zeichen, werden Sie alle 1000 Charaters Platz verbrauchen. In einem varchar2 (1000), werden Sie nur 10 Zeichen verwendet werden. Das Problem kommt, wenn Sie die Daten ändern. Angenommen, Sie haben die Spalte aktualisieren, um jetzt 900 Zeichen lang sein. Es ist möglich, dass der Raum die varchar zu erweitern im aktuellen Block nicht verfügbar ist. In diesem Fall muss der Motor DB die Zeile zu einem anderen Block, migrieren und einen Zeiger in dem Originalblock die neuen Zeile in dem neuen Block machen. Um diese Daten zu lesen, wird der DB-Engine jetzt hat zwei Blöcke zu lesen.
Niemand kann sagen, dass zweideutig varchar oder char ist besser. Es gibt einen Raum für Zeit Kompromiss, und die Prüfung, ob die Daten aktualisiert werden, vor allem, wenn es eine gute Chance, dass es wachsen wird.

Es gibt einen Unterschied zwischen dem frühen Performance-Optimierung und Best-Practice-Regeltyp verwenden. Wenn Sie neue Tabellen erstellen, wo man immer eine feste Länge Feld haben wird, ist es sinn CHAR zu bedienen ist, sollten Sie es in diesem Fall werden. Dies ist nicht früh Optimierung, sondern eine Daumenregel (oder best practice) zu implementieren.

d. - Wenn Sie ein 2-Buchstaben-Statusfeld haben, CHAR (2). Wenn Sie ein Feld mit den tatsächlichen Zustand Namen haben, verwenden Sie VARCHAR.

ich wählen würde, varchar, wenn die Spalte speichert feste Wert wie US-Staat Code - die immer 2 Zeichen lang ist und die Liste der gültigen US-Staaten Code ändert sich nicht oft:)

.

In jedem anderen Fall auch wie Hash-Passwort zu speichern (die festgelegte Länge ist), würde ich varchar wählen.

Warum - Typ char Spalt immer mit Leerzeichen erfüllt ist, die für die Spalte macht my_column als char (5) definiert mit dem Wert 'ABC' innen comparation:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

false.

Das Merkmal zu vielen irritierenden Fehler während der Entwicklung führen könnte und macht das Testen schwieriger.

CHAR nimmt weniger Speicherplatz als VARCHAR, wenn alle Datenwerte in diesem Bereich die gleiche Länge haben. Jetzt vielleicht im Jahr 2009 eine 800 GB-Datenbank die gleiche für alle Absichten und Zwecke als 810GB, wenn Sie die VARCHARs zu Chars umgewandelt, aber für kurze Strings (1 oder 2 Zeichen), CHAR ist immer noch eine Industrie „best practice“ würde ich sagen.

Nun, wenn Sie an der Vielzahl von Datentypen sehen die meisten Datenbanken auch allein für ganze Zahlen liefern (Bit, klein, int, bigint), gibt es Gründe, einen über den anderen zu wählen. Einfach jedes Mal der Wahl Bigint wird eigentlich ein bisschen unwissend von den Zielen und Zwecken des Feldes. Wenn ein Feld einfach ein Person Alter in Jahren, ist ein Bigint Overkill. Jetzt ist es nicht unbedingt „falsch“, aber es ist nicht effizient.

Aber es ist ein interessantes Argument, und als Datenbanken im Laufe der Zeit verbessern, könnte argumentiert CHAR vs VARCHAR werden bekommt weniger relevant.

Ich stehe von Jim McKeeth Kommentar.

Auch die Indizierung und vollständige Tabellenscans sind schneller, wenn Ihre Tabelle nur CHAR Spalten. Grundsätzlich ist der Optimierer in der Lage, vorherzusagen, wie groß jeder Datensatz ist, wenn es nur CHAR-Spalten hat, während er die Größe Wert jeder Spalte VARCHAR überprüfen muss.

Außer, wenn Sie eine VARCHAR-Spalte auf eine Größe größer als sein vorheriger Inhalt aktualisieren Sie die Datenbank zwingen können ihre Indizes neu zu erstellen (weil Sie die Datenbank gezwungen, physisch die Aufzeichnung auf der Festplatte zu bewegen). Während mit CHAR Spalten das wird nie passieren.

Aber Sie werden wahrscheinlich über die Performance-Einbußen nicht egal, wenn Ihre Tabelle sehr groß ist.

Denken Sie daran, Djikstra weiser Worte. Frühe Performance-Optimierung ist die Wurzel aller Übel.

Viele Leute haben darauf hingewiesen, dass, wenn Sie die genaue Länge des Wertes kennen mit CHAR einige Vorteile hat. Aber während der US-Speicherung heißt als CHAR (2) groß ist heute, wenn Sie die Nachricht aus dem Verkauf erhalten, dass ‚wir unseren gerade gemacht haben ersten Verkauf nach Australien‘, Sie sind in einer Welt des Schmerzes. Ich sende immer überschätzen, wie lange ich denke, Felder müssen vielmehr sein, als sie ein ‚genau‘ für zukünftige Ereignisse decken erraten. VARCHAR gibt mir mehr Flexibilität in diesem Bereich.

Es gibt einige kleine Verarbeitungsaufwand die tatsächlich benötigte Größe für einen Spaltenwert bei der Berechnung und den Raum für eine Varchar Zuteilung, wenn Sie also auf jeden Fall sicher sind, wie lange der Wert wird immer sein, ist es besser, Char zu verwenden und vermeiden die getroffen.

Es ist der klassische Raum im Vergleich zu Leistung Kompromiss.

In MS SQL 2005, Varchar (oder NVARCHAR für lanuagues erfordern zwei Bytes pro Zeichen dh Chinesisch) sind variabler Länge. Wenn Sie in die Zeile hinzufügen, nachdem es auf die Festplatte geschrieben wurde, werden die Daten in einer nicht-contigious Lage auf die ursprüngliche Zeile lokalisieren und zu einer Fragmentierung der Datendateien führen. Dadurch wird die Leistung auswirken.

Also, wenn der Raum kein Problem ist, dann ist Char besser für die Leistung, aber wenn Sie die Größe der Datenbank behalten wollen nach unten, dann Varchars sind besser.

Ich denke, in Ihrem Fall gibt es wohl keinen Grund, Varchar nicht zu holen. Es gibt Ihnen die Flexibilität und wie durch eine Reihe von respondants erwähnt wurde, ist die Leistung jetzt so, dass außer in ganz bestimmten Umständen uns Sterblichen meer (im Gegensatz zu Google DBA) nicht den Unterschied bemerken.

Eine interessante Sache erwähnenswert, wenn es um die DB-Typen kommt, ist die SQLite (eine beliebte Mini-Datenbank mit ziemlich beeindruckender Leistung) alles in die Datenbank als String und Typen on the fly setzt.

Ich verwende VarChar immer und in der Regel machen es viel größer, als ich könnte strickly brauchen. Z.B. 50 für Vornamen, wie Sie sagen, warum nicht nur um sicher zu sein.

Fragmentation. Char Reserven Raum und VarChar nicht. Seitenteilung erforderlich sein Update auf varchar gerecht zu werden.

Ich würde nie Zeichen verwenden. Ich habe diese Debatte mit vielen Menschen hatte und sie immer müde Klischee bringen, dass char schneller ist. Nun sage ich, wie viel schneller? Was reden wir hier, Millisekunden, Sekunden, und wenn ja, wie viele? Sie sagen mir, weil jemand seine wenigen Millisekunden schneller behauptet, sollten wir Tonnen schwer vorstellen Fehler in das System zu beheben?

Also hier sind einige Probleme laufen Sie in:

Jedes Feld aufgefüllt werden, so dass Sie mit dem Code am Ende immer das RTRIMS überall hat. Dies ist auch ein großer Speicherplatz Abfall für die längeren Felder aus.

Lassen Sie sich jetzt sagen, Sie das Beispiel für ein char-Feld hat nur ein Zeichen, aber das Feld ist optional. Wenn jemand auf dieses Feld eine leere Zeichenfolge übergibt wird es einen Raum. Also, wenn eine andere Anwendung / Prozess fragt es, bekommen sie einen einzigen Raum, wenn sie nicht rtrim verwenden. Wir haben XML-Dokumente haben, Dateien und andere Programme, Anzeige nur einen Raum, in optionalen Feldern und brechen Dinge.

So, jetzt müssen Sie sicherstellen, dass Sie nulls vorbei sind und nicht leere Zeichenkette, auf die char-Feld. Aber das ist nicht die richtige Verwendung von null. Hier ist die Verwendung von null. Können sagen, Sie eine Datei von einem Anbieter erhalten

Name | Geschlecht | Stadt

Bob || Los Angeles

Wenn Geschlecht nicht angegeben, als Sie Bob, leere Zeichenkette und Los Angeles in die Tabelle ein. Nun können Sie sagen, die Datei erhalten und seine Formatänderungen und Geschlecht sind nicht mehr enthalten, sondern waren in der Vergangenheit.

Name | Stadt

Bob | Seattle

Nun, da die Geschlechter nicht enthalten ist, würde ich null verwenden. Varchars unterstützt dies ohne Probleme.

Char auf der anderen Seite ist anders. Sie müssen immer null schicken. Wenn Sie jemals leere Zeichenfolge senden, werden Sie mit einem Feld am Ende, die Leerzeichen enthält.

könnte ich weiter und weiter gehen mit all den Fehlern, die ich je hatte von Zeichen zu beheben und in etwa 20 Jahren der Entwicklung.

, wenn varchar Werte SQL Server benötigen ein zusätzliches 2 Bytes pro Zeile mit einem paar Informationen über diese Spalte zu speichern, während, wenn Sie Zeichen verwenden Sie es nicht braucht, dass so, wenn Sie

In einigen SQL-Datenbanken wird VARCHAR, um auf seine maximale Größe aufgefüllt werden, um die Offsets zu optimieren, Dies ist Full-Table-Scans und Indizes zu beschleunigen.

Aus diesem Grunde, Sie keine Platzersparnis haben durch einen VARCHAR mit (200) im Vergleich zu einem CHAR (200)

Mit CHAR (NCHAR) und VARCHAR (NVARCHAR) bringt Unterschiede in der Art der Datenbankserver speichert die Daten. Die erste führt Rohlingen nachlauf; Ich habe auftretendes Problem, wenn es mit LIKE-Operator in SQL Server-Funktionen. Also muss ich es sicher durch die Verwendung VARCHAR (NVARCHAR) alle Zeiten.

Zum Beispiel, wenn wir eine Tabelle TEST (ID INT, Status CHAR (1)) haben , und Sie schreiben eine Funktion mit einem spezifischen Wert alle Datensätze zur Liste wie folgt aus:

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

In dieser Funktion erwarten wir, dass, wenn wir den Standardparameter setzen die Funktion alle Zeilen zurück, aber in Wirklichkeit ist es nicht. Ändern Sie den @Status Datentyp VARCHAR wird das Problem beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top