Timestamp的作用及與字串的相互轉換
一.Timestamp的介紹
每一個數據庫都有一個計數器,這個計數器記錄著資料行的插入、更新行為。如果我們為一個表中增加 timestamp 列,那麼,該列將記錄每一個數據行的計數器值。假如資料庫中當前的計數器是 20(實際中不是數字型別,為了方便解釋,這裡用數字型別):那麼在表 A 中插入一條記錄後,插入行的 timestamp 為 21;然後更新表 B 的一條記錄後,更新行的 timestamp 為 22;現在再更新剛才插入的行,此時其 timestamp 為 23。可以看出,每個行都有一個 timestamp,並且是在資料庫的所有表中唯一的,當更新行時,被更新的行的 timestamp 會加 1。注意刪除不影響計數器。 timestamp 作用:timestamp 就是設計來避免更新衝突的,當然還有其它一些作用,比如 SQL Server 全文索引時用以增量填充。我們只需要新增一個為 timestamp 型別的列就可以了,它會自動記下當前計數器的值。一個表只能有一個 timestamp 列,並且不能將該列作為主鍵。不可為空的 timestamp 列在語義上等價於 binary(8) 列;可為空的 timestamp 列在語義上等價於 varbinary(8) 列。
二.timestamp的 應用
1.利用 timestamp 來避免更新衝突。
比如一個內容管理系統,A 正在編輯某一篇文章,B 也正在編輯該文章,A 和 B 都不知道對方在編輯這篇文章,雙方儲存後,都以為已經成功儲存,實際上,資料庫中只儲存了最後提交的記錄(先提交的記錄被覆蓋),這就造成了資料庫中的資料與操作者所認為的不一樣。 要避免這種更新衝突,一種方法可以採用模擬鎖的形式,一個人在編輯另一個人就不允許編輯,但比較麻煩,由於這種更新衝突並非常見,投入較大精力在這上面,不值。這裡使用 timestamp 輕鬆實現避免更新衝突。
1、表中增加一個欄位 tmstmp,型別為 timestamp,參見SQL Server中timestamp(時間戳)。
2、編輯文章時。增加一個隱藏域 <input type="hidden" name="timestamp" value="<%=rs("tmstmp")%>">,(如何顯示timestamp的值: select (欄位名+0) as 別名)。
3、更新文章時。 sql = "update ... where id=" & id & " and tmstmp=" & tmstmp conn.Execute sql, effectLines if effectLines <= 0 then '更新失敗,可能是原記錄不存在,或者更新衝突 end if SQL Server中timestamp(時間戳)
2.判斷最新版本
比如,欄位的標識列屬性(資料型別為數值型):在插入新行時自動新增; 而,欄位的資料型別為時間戳型別:每行更新時資料庫自動更新此行的此欄位的值; 我們知道數字型別有個“標識”屬性,設定好“標識種子”、“標識遞增量”,每增加一條記錄時,這個欄位的值就會在最近的一個標識值基礎上自動增加,這樣我們可以知道哪些記錄是先新增的,哪些記錄是後新增的,但是我們無法知道哪些記錄修改過。timestamp這個型別的欄位呢,每增加一條記錄時,它會在最近的一個時間戳基礎上自動增加,當修改某條記錄時,它也會在最近的一個時間戳基礎上自動增加,所以我們就知道哪些記錄修改過了。
三.幾個疑問
1.timestamp 會重複嗎?
可能會,在使用 select into 時。
2.如何檢視資料庫中當前的 timestamp?
請使用 @@DBTS,比如在查詢分析器中用:print @@DBTS。
3.增、改沒有 timestamp 列的表資料時,@@DBTS 會變嗎?
不會。
4.如何顯示timestamp的值
有朋友反應response.Write(rs("[timestamp]")),是一片空白,可是在查詢分析器中看到的是一串數字。這種情況下,在寫SQL語句時這樣寫,select (欄位名+0) as 別名,輸出時就會有顯示了。(0x000000000000FACC)
5.如何顯示當前資料庫的時間戳
查詢分析器中 print @@DBTS
四.與字串的相互轉換
轉化為字串的方法:
string text3 = "0x" +BitConverter.ToString((byte[]) row["timestamp欄位名"]);
將字串轉化為timestamp,請呼叫下面的方法
public byte[] HexTextToByteArray(string hexText)
{
byte[] buffer2;
try
{
byte[] buffer = null;
string hexString = hexText.Replace("0x", "");
int num = 0;
int num2 = hexString.Length / 2;
buffer = new byte[num2];
for (int i = 0; i < buffer.Length; i++)
{
string s = new string(new char[] { hexString[num], hexString[num + 1] });
buffer[i] = byte.Parse(s, NumberStyles.HexNumber);
num += 2;
}
buffer2 = buffer;
}
return buffer2;
}
相關推薦
Timestamp的作用及與字串的相互轉換
一.Timestamp的介紹 每一個數據庫都有一個計數器,這個計數器記錄著資料行的插入、更新行為。如果我們為一個表中增加 timestamp 列,那麼,該列將記錄每一個數據行的計數器值。假如資料庫中當前的計數器是 20(實際中不是數字型別,為了方便解釋,這裡用數字型別):
java字元陣列與字串相互轉換
1.字串轉化為字元陣列 public class Hello { public static void main(String args[]){ Scanner input = new Scanner(System.in); String str="abc";
Java整型與字串相互轉換
1如何將字串 String 轉換成整數 int? A. 有兩個方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = I
mysql 時間與字串相互轉換
select str_to_date('2018-02-23 15:01:51', '%Y-%m-%d %H:%i:%s') date; date_format(date,format):時間轉字串 select date_format(now(), '%Y-%m-%d') str;
DateTime結構體與字串相互轉換的程式碼實現
問題描述 自定義一個DateTime結構體,程式碼如下: //定義DateTime結構體 struct DateTime { short year; short month; short
MySql資料庫的時間轉換問題 mysql時間與字串相互轉換
轉自 https://www.cnblogs.com/wangyongwen/p/6265126.html mysql時間與字串相互轉換 時間、字串、時間戳之間的互相轉換很常用,但是幾乎每次使用時候都喜歡去搜索一下用法;本文整理一下三者之間的
關於結構體與字串相互轉換驗證
/************************************************************************* > File Name: memtest.c > Author: > Mail: > Crea
C++數值與字串相互轉換的那些事(一)字串轉數值(轉載請註明)
以前一門心思搞演算法,這個東西覺得自己寫個函式就能實現的事,但是到了公司後才發現同事寫的程式碼裡面,呼叫各種庫函式、window API、流來實現。什麼都不懂的我表示鴨梨很大,今天翻了翻資料瞭解了下各種方法的使用方法、區別以及適用範圍,寫成了這篇又長又臭又沒條理的東西。 注
mysql時間與字串相互轉換
時間、字串、時間戳之間的互相轉換很常用,但是幾乎每次使用時候都喜歡去搜索一下用法;本文整理一下三者之間的 轉換(即:date轉字串、date轉時間戳、字串轉date、字串轉時間戳、時間戳轉date,時間戳轉字串)用法,方便日後學習和查閱; 涉及的函式 時間
python 將圖片與字串相互轉換
import base64 image='1.jpg' #將圖片encode為二進位制字串方法一 with open(image,'rb') as f: str=base64.b64encode(f.read()) print(type(str)) #將圖片enc
oracle 時間與字串相互轉換
to_char(date,format):時間轉字串select to_char(sysdate,'YYYY"年"MM"月"DD"日"') 時間轉字串 from dual;to_date(str,for
javascript 物件與字串相互轉換函式 JSON.stringify 和 JSON.parse 的使用
JSON.stringify() The JSON.stringify() method converts a JavaScript value to a JSON string, optionally replacing values if a repla
C語言字串與數字相互轉換
在C/C++語言中沒有專門的字串變數,通常用字元陣列來存放字串。字串是以“\0”作為結束符。C/C++提供了豐富的字串處理函式,下面列出了幾個最常用的函式。 ● 字串輸出函式puts。 ● 字串輸出函式gets。 ●
C/C++中ASCII與Unicode字串相互轉換
轉載地址:https://blog.csdn.net/wbq2018/article/details/8806431 1、ASCII to Unicode 函式: wcstombs(VC6)、wcstombs_s 例項: //crt_wcstombs_s.c //This examp
C/C++ 字串與數字相互轉換
https://www.cnblogs.com/happygirl-zjj/p/4633789.html 一.利用stringstream類 字串到整數 stringstream sstr(str); int x; sstr >> x;(即從sstr中提取資料)
javascript json字串與物件相互轉換
在實際專案中,經常遇到字元格式的問題,記下來以便日後方便檢視。用到兩個函式:JSON.stringify() 和 JSON.parse()。 使用ajax向後臺請求資料,後臺給前端返回資料,明明後端指令碼寫的是json函式處理後的json格式,但是前端接收資料時,卻時而是
python實現字串與二進位制相互轉換
#Convert a string to a binary def encode(Target_string): return ’ ‘.join([bin(ord©).replace(‘0b’, ‘’) for c in Target_string]) #Convert binary to
(各種)C/C++ 字串與數字相互轉換
一、C標準庫atoi, itoa(C++11標準) 字串和int互轉 1. itoa函式 char *itoa(int value, char *string, int radix); value: 待轉化的整數。 radix: 是基數的意思,即先將value轉化
PHP圖片與base64字串相互轉換函式
/** * base64字串轉換成圖片 * @param string $base64_string base64字串 * @param unknown $path 圖片儲存路徑 * @param string $prefix 圖片字首 * @return boolean */ function
JSON物件與JSON字串相互轉換
<!DOCTYPE html> <html> <head> <title>JSON測試 </title> <meta http-equiv="Content-Type" content="text/