全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1828
推到 Plurk!
推到 Facebook!

GUID全球唯一碼/Database 唯一碼問題

尚未結案
Sprlee
一般會員


發表:4
回覆:7
積分:2
註冊:2003-06-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-14 18:01:43 IP:218.18.xxx.xxx 未訂閱
請問各位: 問題原因: 1.我想在每個Table中建立一個全球唯一碼Field,作為Table的 primary key. 2.用windows之GUID 會有32碼,考慮碼太長,不太合適. 請問:能有產生16碼以內的類似GUID(全球唯一碼)的方式提供給再下嗎. 謝謝!
yixiao
一般會員


發表:14
回覆:13
積分:5
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-14 21:20:51 IP:220.170.xxx.xxx 未訂閱
你可使用在用户计算机中硬件全球唯一的标识,在加编号。 如:MAC(网卡硬件地址)
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-14 22:10:17 IP:218.32.xxx.xxx 未訂閱
無關問題解答, 純討論一下, 用 GUID 當 Primary Key, 固然理想,  但是考慮 SQL 的效率, 恐怕沒有比用 Integer 當 Primary Key 好喔.
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-15 10:18:30 IP:61.229.xxx.xxx 未訂閱
引言: 無關問題解答, 純討論一下, 用 GUID 當 Primary Key, 固然理想, 但是考慮 SQL 的效率, 恐怕沒有比用 Integer 當 Primary Key 好喔. < face="Verdana, Arial, Helvetica"> 我也是這麼想,GUID不論是對於使用者或系統而言,都只是一個不具意義的資料,唯一的目的是要能產生不重覆的資料以便能寫入到PK欄位裡.即然如此,為何不在新增一筆資料時直接產生一個最大的序號就好了,何以要用GUID做為PK呢?
Sprlee
一般會員


發表:4
回覆:7
積分:2
註冊:2003-06-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-15 14:45:39 IP:218.18.xxx.xxx 未訂閱
感謝版主及各位朋友的指教.的確,目的很單純,隻是要做一個primary Key.但此Key在後續的應用中會使用很廣.會需要考慮到諸多的情形.如果用integer類型並不能完全滿足要求.基本上需要每一筆資料之的primary key都不一樣才可行.另外就是不想在database中來控制每一次的序流水。原是想能否自已在database中用字軌 序流水來解決,但總覺得不太完美,所以想尋求最好的辦法. 關於用MAC(网卡硬件地址),我try了一下,好象也是32碼長,老板不答應,太長了. :( 謝謝諸位支持.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-15 18:23:47 IP:218.170.xxx.xxx 未訂閱
也許 與server的時間同步 然後用 yyyymmddhhnnss可以吧
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-17 10:15:27 IP:147.8.xxx.xxx 未訂閱
Isn't GUID a 16 bytes structure? In System.pas:    
  TGUID = packed record
    D1: LongWord;
    D2: Word;
    D3: Word;
    D4: array[0..7] of Byte;
  end;
Sprlee
一般會員


發表:4
回覆:7
積分:2
註冊:2003-06-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-21 15:46:26 IP:219.134.xxx.xxx 未訂閱
您說的沒錯.當轉成string後的確為16碼,但show的為非a..z,0..9這間的碼,在database裡面是亂碼情形,查詢與傳送等都有問題. 沒有時間了,我已放棄這種方法了.現在採自已編碼.採用
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-21 15:55:23 IP:210.243.xxx.xxx 未訂閱
亂碼?  用這個方式取得應該不會吧    
uses activex,comobj;    function GetGuid:String;
var g:TGUID;
begin
    CoCreateGUID(g);
    result:=GUIDtoString(g);
end;
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-21 15:55:50 IP:210.243.xxx.xxx 未訂閱
亂碼?  用這個方式取得應該不會吧    
uses activex,comobj;    function GetGuid:String;
var g:TGUID;
begin
    CoCreateGUID(g);
    result:=GUIDtoString(g);
end;
Sprlee
一般會員


發表:4
回覆:7
積分:2
註冊:2003-06-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-06-08 17:10:54 IP:218.18.xxx.xxx 未訂閱
您說的沒錯,但如去掉'-',卻為32碼.我想要得到一個16碼的字串. 
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-06-08 17:55:48 IP:147.8.xxx.xxx 未訂閱
GUID is a 16 bytes record... If you don't mind control character (e.g. null) inside the string, do a memory copy.
系統時間:2024-06-27 3:47:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!