sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad er forskellene mellem CHECKSUM() og BINARY_CHECKSUM() og hvornår/hvad er de passende brugsscenarier?

Tjek følgende blogindlæg, der fremhæver forskellene.

http://decipherinfosys.wordpress. com/2007/05/18/checksum-functions-in-sql-server-2005/

Tilføjelse af oplysninger fra dette link:

Hovedhensigten med CHECKSUM-funktionerne er at bygge et hash-indeks baseret på et udtryk eller en kolonneliste. Hvis du siger, at du bruger det til at beregne og gemme en kolonne på tabelniveau for at angive kontrolsummen over de kolonner, der gør en post unik i en tabel, så kan dette være nyttigt til at afgøre, om en række er ændret eller ej. Denne mekanisme kan så bruges i stedet for at forbinde med alle de kolonner, der gør posten unik for at se, om posten er blevet opdateret eller ej. SQL Server Books Online har en masse eksempler på denne funktionalitet.

Et par ting, du skal være opmærksom på, når du bruger disse funktioner:

Du skal sikre dig, at kolonnen(e) eller udtryksrækkefølgen er den samme mellem de to kontrolsummer, der sammenlignes, ellers ville værdien være anderledes og føre til problemer.

Vi vil ikke anbefale at bruge checksum(*), da den værdi, der vil blive genereret på den måde, vil være baseret på kolonnerækkefølgen af ​​tabeldefinitionen ved kørselstid, som nemt kan ændre sig over en periode. Så definer eksplicit kolonnelisten.

Vær forsigtig, når du inkluderer datetime-datatypekolonnerne, da granulariteten er 1/300-del af et sekund, og selv en lille variation vil resultere i en anden kontrolsumværdi. Så hvis du skal bruge en datetime-datatype-kolonne, så sørg for at få den nøjagtige dato + time/min. dvs. det granularitetsniveau, du ønsker.

Der er tre kontrolsum-funktioner tilgængelige for dig:

CHECKSUM:Dette blev beskrevet ovenfor.

CHECKSUM_AGG:Dette returnerer kontrolsummen af ​​værdierne i en gruppe, og null-værdier ignoreres i dette tilfælde. Dette fungerer også med den nye analytiske funktions OVER-klausul i SQL Server 2005.

BINARY_CHECKSUM:Som navnet angiver, returnerer dette den binære kontrolsumværdi beregnet over en række eller en liste af udtryk. Forskellen mellem CHECKSUM og BINARY_CHECKSUM er den værdi, der genereres for strengdatatyperne. Et eksempel på en sådan forskel er de værdier, der genereres for "DECIPHER", og "decipher" vil være forskellige i tilfælde af en BINARY_CHECKSUM, men vil være de samme for funktionen CHECKSUM (forudsat at vi har en installation af instansen, der ikke er følsom over for store og små bogstaver). En anden forskel er i sammenligningen af ​​udtryk. BINARY_CHECKSUM() returnerer den samme værdi, hvis elementerne i to udtryk har samme type og byte-repræsentation. Så "2Volvo Director 20" og "3Volvo Director 30" vil give den samme værdi, men funktionen CHECKSUM() evaluerer typen samt sammenligner de to strenge, og hvis de er ens, returneres kun den samme værdi.

Example:
STRING              BINARY_CHECKSUM_USAGE    CHECKSUM_USAGE
------------------- ----------------------    -----------
2Volvo Director 20  -1356512636                -341465450
3Volvo Director 30  -1356512636                -341453853
4Volvo Director 40  -1356512636                -341455363


  1. MariaDB LENGTHB() Forklaret

  2. Oracle GROUP_CONCAT() ækvivalent

  3. Syntaksfejl i slutningen af ​​input i PostgreSQL

  4. Fejl ved parsing af data org.json.JSON Undtagelse:Slut på input ved tegn 0 af - Android