sql >> Databasteknik >  >> RDS >> Sqlserver

Vilka är skillnaderna mellan CHECKSUM() och BINARY_CHECKSUM() och när/vilka är lämpliga användningsscenarier?

Kolla in följande blogginlägg som belyser skillnaderna.

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

Lägger till information från denna länk:

Huvudsyftet med CHECKSUM-funktionerna är att bygga ett hashindex baserat på ett uttryck eller en kolumnlista. Om du säger att du använder den för att beräkna och lagra en kolumn på tabellnivå för att beteckna kontrollsumman över kolumnerna som gör en post unik i en tabell, så kan detta vara till hjälp för att avgöra om en rad har ändrats eller inte. Denna mekanism kan sedan användas istället för att gå ihop med alla kolumner som gör posten unik för att se om posten har uppdaterats eller inte. SQL Server Books Online har många exempel på denna funktionalitet.

Ett par saker att se upp med när du använder dessa funktioner:

Du måste se till att kolumn(erna) eller uttrycksordningen är densamma mellan de två kontrollsummorna som jämförs, annars skulle värdet vara annorlunda och leda till problem.

Vi skulle inte rekommendera att använda checksum(*) eftersom värdet som kommer att genereras på det sättet kommer att baseras på kolumnordningen i tabelldefinitionen vid körning som lätt kan ändras över en tidsperiod. Så, definiera explicit kolumnlistan.

Var försiktig när du inkluderar datetime-datatypkolumnerna eftersom granulariteten är 1/300-dels sekund och även en liten variation kommer att resultera i ett annat kontrollsummavärde. Så om du måste använda en kolumn datetime-datatyp, se till att du får det exakta datumet + timme/min. d.v.s. graden av granularitet du vill ha.

Det finns tre kontrollsummafunktioner tillgängliga för dig:

KONTROLLSUMMA:Detta beskrevs ovan.

CHECKSUM_AGG:Detta returnerar kontrollsumman för värdena i en grupp och nollvärden ignoreras i detta fall. Detta fungerar också med den nya analytiska funktionens OVER-klausul i SQL Server 2005.

BINARY_CHECKSUM:Som namnet anger returnerar detta det binära kontrollsummans värde beräknat över en rad eller en lista med uttryck. Skillnaden mellan CHECKSUM och BINARY_CHECKSUM ligger i värdet som genereras för strängdatatyperna. Ett exempel på en sådan skillnad är att värdena som genereras för "DECIPHER" och "dechiffrera" kommer att vara olika i fallet med en BINARY_CHECKSUM men kommer att vara desamma för CHECKSUM-funktionen (förutsatt att vi har en skiftlägesokänslig installation av instansen). En annan skillnad är i jämförelsen av uttryck. BINARY_CHECKSUM() returnerar samma värde om elementen i två uttryck har samma typ och byte-representation. Så, "2Volvo Director 20" och "3Volvo Director 30" kommer att ge samma värde, men CHECKSUM()-funktionen utvärderar typen samt jämför de två strängarna och om de är lika, returneras bara samma värde.

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


  1. Hur ställer jag in sql_mode i my.cnf i MySQL 8?

  2. kan inte öppnas eftersom det är version 706. Denna server stöder version 662 och tidigare. En nedgraderingsväg stöds inte

  3. MySql.Data.MySqlClient.MySqlConfiguration' innehåller ingen definition för 'Standard' flytande NHibernate

  4. Automatisera distributionen av ditt MySQL- eller Postgres-kluster från säkerhetskopia