『壹』 對資料庫的變數不是很了解求高手指點varbinary與varchar之間互轉,請用下面的表名和欄位,本人小菜鳥
你好!
需要轉化,下面給你一個轉化的函數
sql">--==============================================
--FUNCTIONvarbin2hexstr
--將varbinary類型的數據轉換為varchar類型
--==============================================
IFOBJECT_ID('dbo.varbin2hexstr')ISNOTNULL
DROPFUNCTIONdbo.varbin2hexstr
GO
CREATEfunctionvarbin2hexstr(
@binvarbinary(8000)
)returnsvarchar(8000)
as
begin
declare@revarchar(8000),@iint
select@re='',@i=datalength(@bin)
while@i>0
select@re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
+substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
+@re
,@i=@i-1
--return('0x'+@re)
return@re
end
GO
select dbo.varbin2hexstr(0x1432fabcdef1234567890)就知道結果了!
你試試吧!
望採納!
『貳』 ,在java中,資料庫中存儲的ip是varbinary類型,讀出來不能正常顯示,如何讀出並正常顯示
資料庫中的varbinary 類型 對應到java裡面是byte類型, 直接列印出來是內存地址。
所以 new一個String 把拿到的對象放進去。即首先使用byte[]進行接收,接收完成以後使用
new String((byte[]) xxx )獲取為String
『叄』 資料庫中binary 和varbinary類型是如何作為數組使用的
binary保存二進制字元串,它保存的是位元組而不是字元,沒有字元集限制
binary(8)可以保存8個字元,每個字元佔1個位元組,共佔8個位元組
進行比較時是按位元組進行比較,而不是按字元(char),按位元組比較比字元簡單快速
按字元比較不區分大小寫,而binary區分大小寫,結尾使用\0填充,而不是空格
mysql> select * from zcy where b='a\0\0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 5 | t a | a | NULL | a |
+----+------+------+------+----------+
mysql> select * from zcy where b='a \0\0\0\0\0\0';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
varbinary保存變長的字元串,後面不會補\0
mysql> select * from zcy where bn='ab';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 3 | a | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.01 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 2 | asdf | a | ab | ab |
+----+------+------+------+----------+
1 row in set (0.00 sec)
mysql> select * from zcy where bn='ab ';
+----+------+------+------+----------+
| id | name | addr | bn | b |
+----+------+------+------+----------+
| 4 | a | a | ab | a |
+----+------+------+------+----------+
1 row in set (0.00 sec)
『肆』 如何讀取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);
}
}
}
}
『伍』 sql資料庫的varbinary類型數據問題
二進制類型,不能直接在SSMS的界面上修改
create table a_var(id varbinary(500))
insert into a_var select cast('我是一匹來自北方的狼' as varbinary)
select id,CAST(id as varchar(1000)) from a_var
『陸』 哪位前輩做過從SQLServer資料庫讀取varbinary的數據
插入
insert into tableName(item) values(convert(varbinary(200),'11111'))
查詢
select convert(varchar(200),item) as test from tableName
item是欄位名 用string代替
『柒』 C# 讀取資料庫VarBinary( MAX) 數據 亂碼
你是用StreamReader 寫入文件亂碼嗎?
StreamWriter sw=new StreamWriter(Fstream,Encoding.Default)
是沒有設置StreamWriter 的 Encoding 屬性嗎?
『捌』 干貨分享|優炫資料庫支持多業務場景(二)
上期分享中,我們介紹優炫資料庫支持的數據存儲方式。
戳: 干貨分享 優炫資料庫支持多業務場景
本期,我們來講講優炫資料庫支持的多種數據類型。
基本數據類型存儲與管理
優炫資料庫擁有完備的數據類型,內置數據類型包括 數字類型、貨幣類型、字元類型、日期/時間類型、布爾類型、枚舉類型、網路地址類型、位串類型、文本搜索類型等, 支持使用 serial 類型創建表自增列。
通常為了加快指定過濾條件下從表中查詢數據的速度,可以為表的某個欄位或某幾個欄位建立索引。資料庫對基本數據提供多種索引類型:B-tree、Hash、GIN(倒排序索引)和 BRIN(資料庫塊范圍索引)。每一種索引類型使用了一種不同的演算法來適應不同類型的查詢。 默認情況下, CREATE INDEX命令創建適合於大部分情況的B-tree索引。
XML/JSON數據類型存儲與管理
優炫資料庫內置半結構化XML、JSON、JSONB數據類型。
xml數據類型可以被用來存儲XML數據,它比直接在一個text域中存儲XML數據的優勢在於,它會檢查輸入值的結構是不是良好,並且有支持函數用於在其上執行類型安全的操作。xml類型可以存儲結構良好(如XML標准所定義)的「文檔」,以及「內容」片段,它們由XML標准所定義,這意味著內容片段中可以有多於一個的頂層元素或字元節點。通過表達式來評估一個特定的xml值是一個完整文檔或者僅僅是一個文檔片段。
JSON類型強制檢查數據有效性,使用專門的操作符和內置函數操作數據,保留空格,重復鍵和順序等。JSONB是解析輸入後保存的二進制數據,刪除了數據中的空格、調整了順序、優化了存儲、保留最後一個重復鍵值,可被索引。和 JSON 一樣,JSONB支持嵌入式的文檔和數組。JSONB 由若干個鍵值對存儲為單個實體,這種實體稱為文檔。 JSONB具有以下幾個特性:輕量級(Lightweight),可遍歷性(Traversable),高效性(Efficient)。 由於所需存儲更小,JSONB通常是首選格式。兩者區別在於:JSON類型寫快讀慢,JSONB類型寫慢讀快,支持SQL/JSON路徑語言。此外,資料庫支持對這兩類數據的全文檢索。
GIS空間類型存儲與管理
優炫資料庫支持GIS的地理信息應用,支持PostGIS、ArcGIS、超圖,支持OpenGIS聯盟(開放地理信息系統,OGC)抽象數據類型的SQL3規范,提供對地理矢量數據、3D模型、線性參考數據的組織、存儲、空間索引和管理。
Geometry(幾何對象類型)是優炫資料庫的一個基本存儲類型, 空間數據都會以Geometry的形式存儲在資料庫里,本質是個二進制對象。使用OGC推薦的WKT(Well-Known Text)和WKB(Well-Known Binary)格式進行描述,大幅增加了易用性,WKT與WKB基本數據類型(矢量數據)包括:
l 點 (POINT):例如POINT(0 0);
l 線 (LINESTRING):例如LINESTRING(0 0,1 1,1 2)
l 面 (POLYGON多邊形):例如POLYGON((0 0,4 0,4 4,0 4,0 0)) 簡單多邊形,例如POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) 多邊形有一個內部的"孔洞(hole)";
l 多點 (MULTIPOINT):例如MULTIPOINT((0 0),(1 2));
l 多線 (MULTILINESTRING):例如MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4));
l 多面 (MULTIPOLYGON):例如MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)));
l 幾何集合 (GEOMETRYCOLLECTION):例如GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))。
柵格空間數據類型raster用於表示jpeg,tiff,png,DEM模型這樣文件格式的數據。每一個柵格至少有1個波段,每個波段又有一系列像素值,柵格數據是轉換成地理坐標的。可以從資料庫外部導入已有柵格數據,也可在資料庫內創建柵格數據。下面是一個在資料庫內部創建柵格數據的示例:
拓撲類型和函數用於管理拓撲結構,比如面、邊界和點。
創建一個帶有柵格記錄的柵格列的表可以用下面的SQL完成:
如果創建的柵格不依賴於其他柵格,那麼可以使用函數:
ST_MakeEmptyRaster,接著使用ST_AddBand添加柵格數據。也可以使用geometry對象來創建柵格你需要使用函數ST_AsRaster。可能還需要和其他函數比如函數ST_Union 或函數 ST_MapAlgebraFct 或者其他地圖代數系列函數聯合使用。甚至還有一些根據一些已經存在的柵格表創建新的柵格表的可選函數。例如可以使用函數ST_Transform 根據一個已有的柵格表在其他投影系中創建一個新的柵格表。然後通過下SQL命令創建一個空間索引:
通過空間索引R-Tree實現空間數據查詢和操作,R-Tree將數據分解為矩形(rectangle)、子矩形(sub-rectangle)和子-子矩形(sub-sub rectangle)等。它是一種可自動處理可變數據的密度和對象大小的自調優(self-tuning)索引結構。
圖數據存儲與管理
圖數據以圖關系這種數據結構存儲,把圖數據的頂點和邊信息存儲到關系型數據類型中,這些信息包括:
l 頂點(Vertices):一個實體一個頂點,一個實體可以有多個屬性。
l 邊(Edges):兩個實體之間的連接線。
l 屬性:實體和邊都可以有多個屬性。形象舉個例子,一個實體對應關系表中一行記錄,一個實體的屬性代表關系表中這行記錄的所有欄位和值構成的鍵值對。
在優炫資料庫中圖數據通過關系型數據進行存儲,這些數據與圖模型中的數據相對應。例如通過下SQL語句建立存儲圖數據的表:
然後新增加數據,後續就可以根據這些數據進行圖相關的計算和分析了。
時序數據存儲與管理
時序數據存儲和管理,通過把時序數據存儲到關系型數據類型中。時序數據是指時間序列數據。時間序列數據是同一統一指標按時間順序記錄的數據列。在同一數據列中的各個數據必須是同口徑的,要求具有可比性。時序數據可以是時期數,也可以時點數。時間序列分析的目的是通過找出樣本內時間序列的統計特性和發展規律性,構建時間序列模型,進行樣本外預測。
文檔/圖片/視頻類型存儲與管理
優炫資料庫可存儲任意未知具體內容的圖片、聲音、視頻等非結構化數據,支持 GB 級大對象數據類型與流式數據訪問。可藉助於資料庫圖形化管理工具、應用程序、第三方工具等查看這些非結構化數據。根據業務需要也可藉助資料庫插件讀取或識別這些非結構化數據的內容用於數據分析。
優炫資料庫支持多種二進制數據類型,包括:Bytea、OID、Blob、raw、Varbinary、Longvarbinary。
自定義數據類型存儲與管理
優炫資料庫可自定義數據類型、索引、函數等資料庫對象。 新增加的數據類型可以是新數據類型,也可以是已知幾個數據類型的復合數據類型。
模分析型資料庫用戶可在資料庫中使用CREATE TYPE或CREATE DOMAIN命令增加新的數據類型;可通過自定義函數或存儲過程對數據進行各種處理。
CREATE TYPE在當前資料庫中注冊一種新的數據類型,定義數據類型的用戶將成為它的擁有者。五種形式的CREATE TYPE,它們分別創建組合類型、枚舉類型、 范圍類型、基礎類型或者 shell 類型。shell 類型僅僅是一種用於後面要定義的類型的佔位符,通過發出一個不帶除類型名之外其他參數的CREATE TYPE命令可以創建這種類型。在創建范圍類型和基礎類型時,需要 shell 類型作為一種向前引用。
CREATE DOMAIN創建一個新的域。 域本質上是一種帶有可選約束(在允許的值集合上的限制)的數據類型。域主要被用於把欄位上的常用約束抽象到一個單一的位置以便維護。例如,幾個表可能都包含電子郵件地址列,而且都要求相同的 CHECK 約束來驗證地址的語法。可以為此定義一個域,而不是在每個表上都單獨設置一個約束。