① 枚舉值是什麼意思
在數學和計算機科學理論中,一個集的枚舉是列出某些有窮序列集的所有成員的程序,或者是一種特定類型對象的計數。
這兩種類型經常重疊,是一個被命名的整型常數的集合,枚舉在日常生活中很常見。
隨著計算機的不斷普及,程序不僅只用於數值計算,還更廣泛地用於處理非數值的數據。
例如:性別、月份、星期幾、顏色、單位名、學歷、職業等,都不是數值數據。
在其它程序設計語言中,一般用一個數值來代表某一狀態,這種處理方法不直觀,易讀性差。
如果能在程序中用自然語言中有相應含義的單詞來代表某一狀態,則程序就很容易閱讀和理解。
也就是說,事先考慮到某一變數可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值,這種方法稱為枚舉方法,用這種方法定義的類型稱枚舉類型。
枚舉是我們自己定義的一個集合,比如說我們數學裡面所學的集合 A={1、2、3},當我們要使用 A 這個集合的時候,
我們只能夠使用集合 A 裡面的 1、2、3 這三個元素,不是 A 裡面的元素我們就不可以使用。
同樣,枚舉和這個集合是類似的,當我們定義了一個枚舉類型的時候,我們聲明它裡面有幾個元素,
在我們使用這個枚舉的時候,我們只能夠使用它有的元素,沒有的元素我們是無法使用,系統就會報錯。
枚舉還有一個特點,就是可以代表數值,比如說第一個定義的元素對應的值為 0,每個枚舉元素從 0 開始,逐一增加。
此時,這個數值也代表他們本身,相當於每一個元素有兩個名字。
常使用的地方:我們要從另一個函數得到一個值,但是這個值只能夠在一個范圍內的,此時我們就可以,使用枚舉來定義這個范圍。
限制另外一個函數能夠傳遞進來的值,只能夠是枚舉類型裡面的元素。
② c# 中,資料庫取到的值,在枚舉里為空怎麼處理
兩種處理方式。
1、在寫sql的時候
select isnull([欄位名],'') from ...
這樣就會把null的變成「」
2、在給枚舉賦值的時候,判斷一下是不是為空,若為空填充默認值
③ mysql里 enum(F,M,S)什麼意思I
根據用戶定義的枚舉值與分片節點映射文件,直接定位目標分片。
用戶在rule.xml中配置枚舉值文件路徑和分片索引是字元串還是數字,DBLE在啟動時會將枚舉值文件載入到內存中,形成一個映射表
在DBLE的運行過程中,用戶訪問使用這個演算法的表時,WHERE子句中的分片索引值會被提取出來,直接查映射表得到分片編號
- Male=0Male=1
- 123=1123=2
- Mr=0Mrs=1Miss=1Ms=1123=0
與MyCat的類似分片演算法對比
中間件
DBLE
MyCat
分片演算法種類 enum 分區演算法 分片枚舉
兩種中間件的枚舉分片演算法使用上無差別。
開發注意點
【分片索引】1. 整型數字(可以為負數)或字元串((不含=和換行符)
【分片索引】2. 枚舉值之間不能重復
或者
會導致分片策略載入出錯
【分片索引】3. 不同枚舉值可以映射到同一個分片上
運維注意點
【擴容】1. 增加枚舉值無需數據再平衡
【擴容】2. 增加一個枚舉值的分片數量數時,需要對局部數據進行遷移
【縮容】1. 減少枚舉值需要數據再平衡
【縮容】2. 減少一個枚舉值的分片數量數時,需要對局部數據進行遷移
配置注意點
【配置項】1. 在 rule.xml 中,可配置項為<property name="defaultNode"> 、<property name="mapFile"> 和 <property name="type">
【配置項】2. 在 rule.xml 中配置<property name="defaultNode">標簽,非必須配置項,不配置該項的話,用戶的分片索引值沒落在 mapFile 定義的范圍時,DBLE 會報錯;若需要配置,必須為非負整數,用戶的分片索引值沒落在 mapFile 定義的范圍時,DBLE 會路由至這個值的 MySQL 分片
【配置項】3. 在 rule.xml 中配置 <property name="mapFile">標簽,范圍映射文件的路徑:若在映射文件在 DBLE_HOME/conf 或其中,則可以使用相對路徑的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 時,配置值就可以簡寫為 map/table_map.txt;映射文件在 DBLE_HOME/conf 目錄以外時,需要使用絕對路徑,但這種做法需要考慮用戶許可權等問題,因此不建議把映射文件放在 DBLE_HOME/conf 外。
【配置項】4. 編輯 mapFile 所配置的文件
記錄格式為:<枚舉值>=<分片編號>
枚舉值可以是整型數字,或任意字元(除了=和換行符),分片編號必須是非負整型數字,記錄之間以換行分隔,一行僅能有一條記錄,枚舉值不能夠是「DEFAULT_NODE」這個字元串,允許以「//」和「#」在行首來注釋該行
【配置項】5. 在 rule.xml 中配置 <property name="type">標簽;type 必須為整型;取值為 0 時,mapFile 的<枚舉值>必須為整型;取值為非 0 時,mapFile 的<枚舉值>可以是任意字元(除了=和換行符)
④ 資料庫的枚舉型問題
1、這個類型可以多種:int, char(n) -- 只要約定好就行,存貯枚舉值的代碼
2、枚舉類型的允許值,可以由DB保證(比如在tradeInfo.tradeType上加約束);也可以只是由程序來控制 -- DB中加上約束會強壯一些,但會犧牲性能;
3、為了軟體界面的易讀性,通常需要讓枚舉值可讀。每個枚舉值對應的文本最好存貯在DB中。這個稱為MasterData。可以建一張表存貯
4、如果有對應的主數據表,前面2中的約束,就可以改為Foreign Key
至於JAVA編程,枚舉類型的處理,可以使用常量,也可以更優雅地定義一個類。
⑤ 在資料庫中存枚舉值,用數字還是字元好
數據量不大用字元吧,可讀性強
⑥ 在資料庫中存枚舉值,用數字還是字元好
這個要看你的 枚舉, 是 僅僅一次只能選擇一個的? 還是一次可以選擇多個的.
例如你的
order_id order_status
1 SUCS(成功success)
2 PCES(處理process)
某行數據, 要麼就是 SUCS(成功success) , 要麼就是 PCES(處理process)
這種情況下, 用字元是比較合適的。
但是如果枚舉是可以選擇多個的, 例如:
id desc
1 無黨派
2 知識分子
4 少數民族
8 女性
16 ......
這種情況下, 如果一個人, 多個枚舉都滿足的情況下, 那麼這種情況下, 使用 數字 是比較適合的。
也就是
如果某個人,是 無黨派漢族女性研究生, 那麼枚舉值 = 1+2+8
⑦ 資料庫欄位,枚舉
這個要放點代碼。但是這種方式沒有必要,其次就放50分,實在少點,回頭你看我的回復
是否值50分?
----------------------
第一:如果代碼類似如下
columns[int(TC_User.id)]
columns[int(TC_User.Name)]
columns[int(TC_User.Sex)]
columns[int(TC_User.Address)]
如果從持久實體直接獲取,雖然有點效率,但是你可以試驗一下如下查詢:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='T_CRD'
以上T_CRD 是表名,你看到有一列是ORDINAL_POSITION:
這個是按照資料庫設計表的自然序排列,之後你就看到,只要在設計視圖中換換位置就改變了這個值。
本身在DBA優化里有一項就是數據類型同項歸類提速,結果代碼過於拘泥,讓DBA根本不能實施這項工作。這是一方面:
--------------------------------------------------
第二:其次就是使用反射來獲悉枚舉列名。你可以自己試驗一下:還不如最原始的if else快,性能差個幾百倍。
--------------------------------------------------
第三:即使元數據析構table,也是類似如下方式,如下是linq上下文生成列的方式,使用的是特性描述,別看原始,這確是大智慧。
[Column(Storage="_RpNo", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
public string RpNo
{
get
{
return this._RpNo;
}
set
{
if ((this._RpNo != value))
{
this.OnRpNoChanging(value);
this.SendPropertyChanging();
this._RpNo = value;
this.SendPropertyChanged("RpNo");
this.OnRpNoChanged();
}
}
}
---------------------
第四:如果你們領導都同意用枚舉來映射表,你也沒必要修改,順水推舟吧!
出錯你在擺平,也讓你出名一把!你自己先提前想好方案!
⑧ 如何通過資料庫欄位動態生成枚舉
利用反射(Reflection),通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委託、介面和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了構造函數的信息,即可直接創建對象,即使這個對象的類型在編譯時還不知道。
⑨ 資料庫設計-枚舉欄位的設計
create table tb_name(type_id int,type_name varchar(50))
insert into tb_name values(1,'紅色')
insert into tb_name values(2,'綠色')
insert into tb_name values(3,'黃色')
insert into tb_name values(4,'白色')
insert into tb_name values(5,'黑色')