假設現在你想捉弄下sql server,在varchar(8000)的列上建立乙個索引,並在索引鍵列上插入超900byte的值。想想,sql server會如何反應?不知道?我們來試驗下。在下列**裡,我建立了有varchar(8000)列的表,並在這列上建立非聚集索引。
usesql server這裡已給你乙個插入/更新操作會失敗的警告:tempdb
go--
create a ****** table
create
table
foo(
bar
varchar(8000))
go--
create a ****** non-clustered index
create
nonclustered
index idx_bar on
foo(bar)
go
現在糟糕的事情發生了:我插入一條901byte大小列的記錄。
--偶滴神——如你所見,現在插入不會發生:insert a too large index key column...
insert
into foo values(replicate('
x', 901
))go
sql server還是會確保我們的鍵大小在900bytes限制內。我們來插入剛好900bytes鍵大小的記錄。
--現在這個會正常執行,沒有問題。但如果我們再次更新那列,讓它大於900bytes,會發生什麼?this will work
insert
into foo values(replicate('
x', 900
))go
--update語句也會失敗!這是對的。sql server再次保證鍵大小還是在它限制裡。啥收穫?不管你怎麼折騰,你不會打破sql server。this update will fail
update foo set bar =
replicate('
x', 901
)go
VARCHAR列上的索引
一年前,我寫了在索引的導航結構裡,sql server如何儲存varchar列。我們都知道,在sql server裡索引 聚集索引,非聚集索引 的鍵列有最大900byte的大小限制。假設現在你想捉弄下sql server,在varchar 8000 的列上建立乙個索引,並在索引鍵列上插入超900by...
bigInt與varchar索引的大小
今天晚上突然想到乙個問題 對於單個欄位的索引,用bigint和varchar做索引,bigint索引到底能減少多大?於是我建了兩張表 create table test long id bigint 20 not null,key in id engine innodb default charse...
VARCHAR欄位指定索引長度
在varchar欄位上建立索引時,必須指定索引長度,沒必要對全欄位建立索引,根據實際文字區分度決定索引長度 阿里開發手冊 create table my user id bigint unsigned user name varchar 50 primary key id insert into m...