BigInt oder Varchar für eine große Anzahl, nach der ich niemals sortieren / rechnen werde

7

Ich muss die Facebook-IDs der Benutzer in einer Spalte in meiner Datenbank speichern.

Die ID besteht immer nur aus Ziffern und kann bis zu einer Zahl von mehr als 500 Millionen betragen. In Anbetracht dessen, dass ich niemals arithmetisch arbeiten, sortieren oder relationale Operatoren für die Werte verwenden muss, was wäre eine bessere Wahl: BigIntoder varchar?

Der Wert wird immer eindeutig und niemals nicht vorhanden sein ( null)

Die einzige Operation, die ich mache, ist die Überprüfung auf das Vorhandensein einer ID in der Datenbank, dh des =Operators.

xbonez
quelle

Antworten:

4

varchar fügt Overhead hinzu:

  • Die Länge der Zeichenfolge muss pro Feld und im Index gespeichert werden (zusätzliche 2 Byte IIRC in MySQL)
  • erfordert mehr Verarbeitung für die Sortierung beim Vergleich

Wie beschreibt die Facebook-API den Typ? Verwenden Sie natürlich die "native"

gbn
quelle
Die JSON-codierte Antwort von der Facebook-API schlägt keinen Typ vor. Hier ist ein Beispiel: graph.facebook.com/ayushsobti
xbonez
2
Ich sehe in http://developers.facebook.com/docs/reference/api/user/ : "Felder. Das Benutzerobjekt hat die folgenden Felder:"Name: id | Description: The user's Facebook ID | Permissions: No access_token required | Returns: **string**
ypercubeᵀᴹ
1

Laut der MySQL-Dokumentation zu BIGINT

BIGINT [(M)] [UNSIGNED] [ZEROFILL] Eine große Ganzzahl. Der vorzeichenbehaftete Bereich liegt zwischen -9223372036854775808 und 9223372036854775807. Der vorzeichenlose Bereich liegt zwischen 0 und 18446744073709551615.

SERIAL ist ein Alias ​​für BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.

Einige Dinge, die Sie in Bezug auf BIGINT-Spalten beachten sollten:

■ Alle Arithmetik wird mit vorzeichenbehafteten BIGINT- oder DOUBLE-Werten ausgeführt. Verwenden Sie daher keine vorzeichenlosen großen Ganzzahlen größer als 9223372036854775807 (63 Bit), außer mit Bitfunktionen! Wenn Sie dies tun, können einige der letzten Ziffern im Ergebnis aufgrund von Rundungsfehlern beim Konvertieren eines BIGINT-Werts in ein DOUBLE falsch sein.

MySQL kann BIGINT in folgenden Fällen verarbeiten:

◦ Wenn Sie Ganzzahlen verwenden, um große vorzeichenlose Werte in einer BIGINT-Spalte zu speichern.

◦ In MIN (col_name) oder MAX (col_name), wobei col_name auf eine BIGINT-Spalte verweist.

◦ Bei Verwendung von Operatoren (+, -, * usw.), bei denen beide Operanden Ganzzahlen sind.

■ Sie können jederzeit einen genauen ganzzahligen Wert in einer BIGINT-Spalte speichern, indem Sie ihn mit einer Zeichenfolge speichern. In diesem Fall führt MySQL eine Konvertierung von Zeichenfolgen in Zahlen durch, bei der keine Darstellung mit doppelter Genauigkeit erforderlich ist.

■ Die Operatoren -, + und * verwenden die BIGINT-Arithmetik, wenn beide Operanden ganzzahlige Werte sind. Dies bedeutet, dass Sie beim Multiplizieren von zwei großen Ganzzahlen (oder Ergebnissen von Funktionen, die Ganzzahlen zurückgeben) unerwartete Ergebnisse erhalten können, wenn das Ergebnis größer als 9223372036854775807 ist.

Wie Sie sagten, würde ich mich für BIGINT entscheiden, solange Sie keine Arithmetik, Sortierung oder Verwendung von Vergleichsoperatoren für die Werte durchführen.

In der soeben erwähnten Dokumentation wird die Nummer als Zeichenfolge gespeichert, um Zwischenschritte zu umgehen, die durch Darstellung mit doppelter Genauigkeit ausgeführt werden.

RolandoMySQLDBA
quelle