1. sql server 2008 設置局部變數類型為 VARCHAR(max) 為什麼還是 只能存儲8000位元組
實際變數的存儲空間並沒有變化,只是增加了指針,你說的問題是什麼情況?
插入超過8K位元組溢出了嗎?能否提供截圖看看
===========================
varchar(max)、nvarchar(max) 和 varbinary(max) 統稱為大值數據類型。您可以使用大值數據類型來存儲最大為 2^31-1 個位元組的數據。
大值數據類型具有 text、ntext、image 這樣大容量存儲能力
可通過 sp_tableoption 將這些大容量的數據直接存儲在行內(超過 8000 位元組時,仍然是只在行內存儲指針),還是只在行內存儲指針。
大值數據類型又具有 varchar(n)、nvarchar(n)、varbinary(n) 這樣的應用方便的特性
可以使用游標;
可以使用 .WRITE() 對大值數據進行部分更新;
支持觸發器;
可以使用像 LEN、SUBSTRING 等字元串函數。
所以微軟建議:使用 varchar(max) 來代替 text,使用 nvarchar(max) 來代替 ntext,使用 varbinary(max) 來代替 image。
2. 如何讀取SQL server資料庫中varbinary欄位內容
如果把照片直接保存在SQL Server資料庫中,微軟推薦用varbinary(MAX)欄位。下面的代碼演示了用C#操作varbinary(MAX)欄位的基本方法。
1、新增記錄
private void btnBrowse_Click(object sender, EventArgs e)//瀏覽照片
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "*.jpg(jpg文件)|*.jpg|*.gif|*.gif";
dlg.FilterIndex = 1;
if (dlg.ShowDialog()==DialogResult.OK)
{
textBox3.Text = dlg.FileName;
pictureBox1.Image = Image.FromFile(dlg.FileName);
}
}
//新增記錄
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
{
String sql = "insert into emp(name,age,photo) values(@name,@age,@photo)";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@name", textBox1.Text);
cmd.Parameters.AddWithValue("@age", Convert.ToInt32(textBox2.Text));
//byte[] b;
//using(FileStream fs=new FileStream(textBox3.Text,FileMode.Open,FileAccess.Read))
//{
// b = new byte[fs.Length];
// fs.Read(b, 0, (int)fs.Length);
//}
byte[] b;
if (textBox3.Text != "")
{
b = File.ReadAllBytes(textBox3.Text);
cmd.Parameters.AddWithValue("@photo", b);
}
else
{
cmd.Parameters.AddWithValue("@photo", System.Data.SqlTypes.SqlBinary.Null);
}
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
2、顯示記錄信息並提供修改功能
private void FormDetail_Load(object sender, EventArgs e)//顯示記錄詳細信息
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
{
String sql = "select * from emp where id=@id";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@id", id);
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
if(dr.Read())
{
textBox1.Text = dr[1].ToString();
textBox2.Text = dr[2].ToString();
if (!dr.IsDBNull(3))//防止照片欄位為空
{
System.Data.SqlTypes.SqlBytes bytes = dr.GetSqlBytes(3);
pictureBox1.Image=Image.FromStream(bytes.Stream);//顯示照片
}
}
}
}
}
private void btnSave_Click(object sender, EventArgs e)//更新記錄
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
{
byte[] b;
if (textBox3.Text != "")//需要更新照片
{
String sql = "update emp set name=@name,age=@age,photo=@photo where id=@id";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@name", textBox1.Text);
cmd.Parameters.AddWithValue("@age", Convert.ToInt32(textBox2.Text));
cmd.Parameters.AddWithValue("@id", id);
b = File.ReadAllBytes(textBox3.Text);
cmd.Parameters.AddWithValue("@photo", b);
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else//不需要更新照片
{
String sql = "update emp set name=@name,age=@age where id=@id";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@name", textBox1.Text);
cmd.Parameters.AddWithValue("@age", Convert.ToInt32(textBox2.Text));
cmd.Parameters.AddWithValue("@id", id);
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
3. SQL中數據類型有哪些
int 整型 int 數據類型可以存儲從- 231(-2147483648)到231 (2147483 647)之間的整數。存儲到資料庫的幾乎所有數值型的數據都可以用這種數據類型。這種數據類型在資料庫里佔用4個位元組
tinyint 整型 tinyint 數據類型能存儲從0到255 之間的整數。它在你只打算存儲有限數目的數值時很有用。 這種數據類型在資料庫中佔用1 個位元組
float 近似數值型 float 數據類型是一種近似數值類型,供浮點數使用。說浮點數是近似的,是因為在其范圍內不是所有的數都能精確表示。浮點數可以是從-1.79E+308到1.79E+308 之間的任意數
bit 整型 bit 數據類型是整型,其值只能是0、1或空值。這種數據類型用於存儲只有兩種可能值的數據,如Yes 或No、True 或Fa lse 、On 或Off
char 字元型 char數據類型用來存儲指定長度的定長非統一編碼型的數據。當定義一列為此類型時,你必須指定列長。當你總能知道要存儲的數據的長度時,此數據類型很有用。例如,當你按郵政編碼加4個字元格式來存儲數據時,你知道總要用到10個字元。此數據類型的列寬最大為8000 個字元
varchar 字元型 varchar數據類型,同char類型一樣,用來存儲非統一編碼型字元數據。與char 型不一樣,此數據類型為變長。當定義一列為該數據類型時,你要指定該列的最大長度。 它與char數據類型最大的區別是,存儲的長度不是列長,而是數據的長度
nchar 統一編碼字元型 nchar 數據類型用來存儲定長統一編碼字元型數據。統一編碼用雙位元組結構來存儲每個字元,而不是用單位元組(普通文本中的情況)。它允許大量的擴展字元。此數據類型能存儲4000種字元,使用的位元組空間上增加了一倍
nvarchar 統一編碼字元型 nvarchar 數據類型用作變長的統一編碼字元型數據。此數據類型能存儲4000種字元,使用的位元組空間增加了一倍
text 字元型 text 數據類型用來存儲大量的非統一編碼型字元數據。這種數據類型最多可以有231-1或20億個字元
datetime 日期時間型 datetime數據類型用來表示日期和時間。這種數據類型存儲從1753年1月1日到9999年12月3 1日間所有的日期和時間數據, 精確到三百分之一秒或3.33毫秒
Smalldatetime 日期時間型 smalldatetime 數據類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鍾
image 二進制數據類型 image 數據類型用來存儲變長的二進制數據,最大可達231-1或大約20億位元組
基本查詢
select column1,columns2,...
from table_name
說明:把table_name 的特定欄位資料全部列出來
select *
from table_name
where column1 = ***
[and column2 > yyy] [or column3 <> zzz]
說明:
1.'*'表示全部的欄位都列出來。
2.where 之後是接條件式,把符合條件的資料列出來。
select column1,column2
from table_name
order by column2 [desc]
說明:order by 是指定以某個欄位做排序,[desc]是指從大到小排列,若沒有指明,則是從小到大
排列
組合查詢
組合查詢是指所查詢得資料來源並不只有單一的表格,而是聯合一個以上的
表格才能夠得到結果的。
select *
from table1,table2
where table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格相互比較的欄位,其資料形態必須相同。
3.一個復雜的查詢其動用到的表格可能會很多個。
整合性的查詢:
select count (*)
from table_name
where column_name = ***
說明:
查詢符合條件的資料共有幾筆。
select sum(column1)
from table_name
說明:
1.計算出總和,所選的欄位必須是可數的數字形態。
2.除此以外還有 avg() 是計算平均、max()、min()計算最大最小值的整合性查詢。
select column1,avg(column2)
from table_name
group by column1
having avg(column2) > ***
說明:
1.group by: 以column1 為一組計算 column2 的平均值必須和 avg、sum等整合性查詢的關鍵字
一起使用。
2.having : 必須和 group by 一起使用作為整合性的限制。
復合性的查詢
select *
from table_name1
where exists (
select *<BR>from table_name2
where conditions )
說明:
1.where 的 conditions 可以是另外一個的 query。
2.exists 在此是指存在與否。
select *
from table_name1
where column1 in (
select column1
from table_name2
where conditions )
說明:
1. in 後面接的是一個集合,表示column1 存在集合裡面。
2. select 出來的資料形態必須符合 column1。
其他查詢
select *
from table_name1
where column1 like 'x%'
說明:like 必須和後面的'x%' 相呼應表示以 x為開頭的字串。
select *
from table_name1
where column1 in ('***','yyy',..)
說明:in 後面接的是一個集合,表示column1 存在集合裡面。
select *
from table_name1
where column1 between xx and yy
說明:between 表示 column1 的值介於 xx 和 yy 之間。
3、更改資料:
update table_name
set column1='***'
where conditoins
說明:
1.更改某個欄位設定其值為'***'。
2.conditions 是所要符合的條件、若沒有 where 則整個 table 的那個欄位都會全部被更改。
4、刪除資料:
delete from table_name
where conditions
說明:刪除符合條件的資料。
說明:關於where條件後面如果包含有日期的比較,不同資料庫有不同的表達式。具體如下:
(1)如果是access資料庫,則為:where mydate>#2000-01-01#
(2)如果是oracle資料庫,則為:where mydate>cast('2000-01-01' as date)
或:where mydate>to_date('2000-01-01','yyyy-mm-dd')
在delphi中寫成:
thedate='2000-01-01';
query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');
如果比較日期時間型,則為:
where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')
4、增加資料:
insert into table_name (column1,column2,...)
values ( value1,value2, ...)
說明:
1.若沒有指定column 系統則會按表格內的欄位順序填入資料。
2.欄位的資料形態和所填入的資料必須吻合。
3.table_name 也可以是景觀 view_name。
insert into table_name (column1,column2,...)
select columnx,columny,... from another_table
說明:也可以經過一個子查詢(subquery)把別的表格的資料填入。
4. 資料庫從sql 2008換到sql 2000,關於varbinary(max)問題
8000可以啦 大的二進制數據盡量不要寫到資料庫中影響資料庫讀寫速度
5. sql VARBINARY(MAX)數據類型 在oracle中該是什麼類型
二進制串 ,oracle中一般都是用BLOB來存儲,可以保存二進制大數據。
oracle中BLOB的長度可以很大,而sql中VARBINARY的最大長度有限制,貌似是8000吧。
6. sql中varbinary 是什麼數據類型
varbinary 類型和char與varchar類型是相似的,只是他們存儲的是二進制數據,也就是說他們是包含位元組流而不是字元流,他們有二進制字元的集合和順序,他們的對比,排序是基於位元組的數值進行的
binary與varbinary的最大長度和char與varchar是一樣的,只不過他們是定義位元組長度,而char和varchar對應的是字元長度。Varbinary是一個可以改變長度的二進制數據。
Varbinary[(n)] 是 n 位變長度的二進制數據。其中,n 的取值范圍是從 1 到 8000。其存儲窨的大小是 n + 4個位元組,不是n 個位元組。
varbinary在插入不會去填補0x00位元組,查詢的時候也不會丟棄任何位元組,在比較的時候,所有的位元組都是有效的,並且0x00<space (space對應的是0x20)。
(6)sqlvarbinarymax擴展閱讀:
varbinary( n | max):可變長度,n 的取值范圍為 1 至 8,000,max 是指最大存儲空間是 2^31-1 個位元組,即最大4GB;
在將數據轉換為二進制數據時,SQL Server會對生成的二進制數據進行填充或截斷,詳細的規則是:
1、填充(或擴展)的二進制數據是16進制的0x00的整數倍,這就是說,填充的位元組中每一個bit都是0;
2、將字元類型轉換成二進制數據時,在數據的右側填充或截斷數據,填充數值是0x00;
3、將其他類型數據轉換成二進制數據時,在數據的左側填充或截斷數據,填充數值是0x00;在截斷數據時,保留低位的數據,將高位數值截斷。
7. sql中varbinary 是什麼數據類型
varbinary
變長二進制數據,一般用於存儲圖片
與binary的區別
binary
和
varbinary
固定長度
(binary)
的或可變長度
(varbinary)
的
binary
數據類型
8. 在sql server 中能保存成千上萬的文字的類型是什麼類型啊
這種類型是 text
在MS SQL2005及以上的版本中,加入大值數據類型(varchar(max)、nvarchar(max)、varbinary(max) )。大值數據類型最多可以存儲2^30-1個位元組的數據
varchar(max):文本,代替text
nvarchar(max):Unicode文本,代替ntext ,存放多語言文本的時候必須用這個
varbinary(max):二進制數據,代替image,存放非文本數據必須用這個
如果你不是用的2005以下版本,建議你用varchar(max)、nvarchar(max)、varbinary(max),這樣可以避免很多text的限制
9. SQL資料庫的數據類型有哪些,請詳細解釋一下
》SQL Server 中的數據類型歸納為下列類別:
精確數字
Unicode 字元串
近似數字
二進制字元串
日期和時間
其他數據類型
字元串
》在 SQL Server 中,根據其存儲特徵,某些數據類型被指定為屬於下列各組:
大值數據類型:varchar(max)、nvarchar(max) 和
varbinary(max)
大型對象數據類型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)
和 xml
》精確數字
bit(位)
tinyint(1個位元組)
smallint(2個位元組,-32767~32767)
int(4個位元組,-20億~20億)
bigint(8個位元組)
numeric
decimal
smallmoney
money
》近似數字
float
real
》日期和時間
date
smalldatetime(精確到分鍾)
datetime
datetime2
time
datetimeoffset(時間差)
》字元串
char
varchar
text
》Unicode 字元串
nchar
nvarchar
ntext
》二進制字元串
binary
varbinary
image