1. 程式人生 > >Timestamp的作用及與字串的相互轉換

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++中ASCIIUnicode字串相互轉換

轉載地址: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/