當前位置:首頁 » 數據倉庫 » 資料庫某個欄位太長
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫某個欄位太長

發布時間: 2023-02-28 06:30:41

資料庫中的一個欄位的數據大小不定如何設置欄位的長度查詢最快又節省空間

varchar是可變字元,varchar(2000)即可,不會浪費空間。
樓主為何要將歷史記錄存在access中呢?若您後台有sql server支持,建議您歷史記錄也存放在sql中,access的性能及對sql的語言支持都遠不如 MSSQL。

【VARCHAR限制了字元串的長度不能超過255個字元?】---哦,忘記了,這個可能access有此限制,sql可以的,最大varchar(8000)。
varchar(100)中的100並不多餘,在未存儲數據時用於佔位,系統會用於預先計劃分配空間,但直到真正存儲數據時才確實分配存儲空間。

個人看法:
1.佔用空間上varchar(100)和varchar(2000)沒什麼區別。
2.但varchar(100)會效率較低,因為按你說的該欄位會5-2000,若大於100,則您每次固定寫入100會需要多次寫操作,眾所周知寫操作是比較耗時的。
3.查詢性能方面,跟您這兒怎麼存沒太大關系,重要的還是常見的資料庫查詢優化,如索引、條件等等

對這個問題,我引用一下CSDN上的說法:

一。數據行結構
char(n): 系統分配n個位元組給此欄位,不管欄位實際長度(後邊用空格補齊)

varchar(n): 假設表中有M個varchar(或者nvarchar)類型的欄位
先分配兩個位元組(用來表示M)
再分配2*M個位元組(表示各變長行的偏移)
此後欄位值有多長,就分配多長

二。varchar(n)一定比char(n)節省空間么?
不一定。
我見過這樣的設計: varchar(3)
就算此欄位為空,也還是比char(3)多用一個位元組。

還有這樣的設計: user_ip varchar(16).
對於這種數據長度變化不大的欄位,用varchar只能浪費空間

結論: varchar適用於數據值長度不太短,且長度變化較大的欄位

三。char(n)一定比varchar(n)速度快么?
不一定
計算varchar的偏移是會花去一些cpu時間,但性能瓶頸不在此,在io.
db的io單位是數據頁(8192位元組)(一頁存有多個數據行,數據行不能跨頁。當然image,text等例外). 因此一頁中行越多,性能越好

另外,關於char和varchar的性能比較,

請參見該實驗:
http://www.yuanma.org/data/2006/0730/article_1266.htm

再補充一下:

[轉帖]char、nchar、varchar、nvarchar,對比那個好?

資料庫定義到char類型的欄位時,不知道大家是否會猶豫一下,到底選char、nchar、varchar、nvarchar、
text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長的,感覺比變長能省些空
間,而且處理起來會快些,無法定長只好選用定長,並且將長度設置盡可能地小;另一種是則是覺得無所謂,
盡量用可變類型的,長度盡量放大些。

鑒於現在硬體像蘿卜一樣便宜的大好形勢,糾纏這樣的小問題實在是沒多大意義,不過如果不弄清它,
總覺得對不起勞累過度的CPU和硬碟

下面開始了(以下說明只針對SqlServer有效):

1、當使用非unicode時慎用以下這種查詢:
select f from t where f = N'xx'

原因:無法利用到索引,因為資料庫會將f先轉換到unicode再和N'xx'比較

2、char 和相同長度的varchar處理速度差不多(後面還有說明)

3、varchar的長度不會影響處理速度!!!(看後面解釋)

4、索引中列總長度最多支持總為900位元組,所以長度大於900的varchar、char和大於450的nvarchar,nchar
將無法創建索引

5、text、ntext上是無法創建索引的

6、O/R Mapping中對應實體的屬性類型一般是以string居多,用char[]的非常少,所以如果按mapping的
合理性來說,可變長度的類型更加吻合

7、一般基礎資料表中的name在實際查詢中基本上全部是使用like '%xx%'這種方式,而這種方式是無法利用
索引的,所以如果對於此種欄位,索引建了也白建

8、其它一些像remark的欄位則是根本不需要查詢的,所以不需要索引

9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長度和它實際佔用
空間是無關的

10、對於固定長度的欄位,是需要額外空間來存放NULL標識的,所以如果一個char欄位中出現非常多的NULL,
那麼很不幸,你的佔用空間比沒有NULL的大(但這個大並不是大太多,因為NULL標識是用bit存放的,
可是如果你一行中只有你一個NULL需要標識,那麼你就白白浪費1byte空間了,罪過罪過!),這時候,
你可以使用特殊標識來存放,如:'NV'

11、同上,所以對於這種NULL查詢,索引是無法生效的,假如你使用了NULL標識替代的話,那麼恭喜你,
你可以利用到索引了

12、char和varchar的比較成本是一樣的,現在關鍵就看它們的索引查找的成本了,因為查找策略都一樣,
因此應該比較誰佔用空間小。在存放相同數量的字元情況下,如果數量小,那麼char佔用長度是小於varchar
的,但如果數量稍大,則varchar完全可能小於char,而且要看實際填充數值的充實度,比如說varchar(3)
和char(3),那麼理論上應該是char快了,但如果是char(10)和varchar(10),充實度只有30%的情況下,
理論上就應該是varchar快了。因為varchar需要額外空間存放塊長度,所以只要length(1-fillfactor)
大於這個存放空間(好像是2位元組),那麼它就會比相同長度的char快了。

13、nvarchar比varchar要慢上一些,而且對於非unicode字元它會佔用雙倍的空間,那麼這么一種類型
推出來是為什麼呢?對,就是為了國際化,對於unicode類型的數據,排序規則對它們是不起作用的,
而非unicode字元在處理不同語言的數據時,必須指定排序規則才能正常工作,所以n類型就這么一點好處。

總結陳詞:
1、如果數據量非常大,又能100%確定長度且保存只是ansi字元,那麼char
2、能確定長度又不一定是ansi字元或者,那麼用nchar;
3、不確定長度,要查詢且希望利用索引的話,用nvarchar類型吧,將它們設到400;
4、不查詢的話沒什麼好說的,用nvarchar(4000)
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說明,等於告訴別人說,我一定需要長度
為X位的數據

❷ oracle資料庫有一個欄位,長度超過表結構的長度或欄位格式不對,導致查詢的時候查詢報錯

查詢資料庫中,表結構的詳細信息 SELECT
表名=case when a.colorder=1 then d.name else '' end,
欄位序號=a.colorder,
欄位名=a.name,
標識=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
主鍵=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
))) then '√' else '' end,
類型=b.name,
佔用位元組數=a.length,
長度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小數位數=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
允許空=case when a.isnullable=1 then '√'else '' end,
默認值=isnull(e.text,''),
欄位說明=isnull(g.[value],'')
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e on a.cdefault=e.id
left join sysproperties g on a.id=g.id and a.colid=g.smallid
order by a.id,a.colorder

❸ 使用PL/SQL的文本導入器欄位內容太長無法導入,該怎麼弄,請大家幫我想想辦法。謝謝啦。

SQL Server 2005 開始,那個導入導出向導與 SQL Server 2000 的不一樣。以文本文件(.txt,.csv)導入資料庫表格為例,默認情況下,新版導入導出向導是默認取文本文件的前 200 行數據(在選擇平面數據源-高級-建議類型裡面可以更改行數),來決定每一個欄位的(最小)數據類型,然後導入時將文本文件欄位的數據類型轉換為數據表相應欄位的數據類型。這樣就可能發生截斷和類型轉換出錯。
解決辦法就是,人工選擇(文本文件)數據源後,在導入導出向導的第二個頁面,「選擇數據源」(文本)後,「高級」選項裡面,根據數據表依次指定文本文件每一列的數據類型(DataType)和寬度(OutputColumnWidth),使其一致,然後就可以執行導入。這一步需要花點時間。