欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql enum字段類型的謹慎使用

 更新時間:2022年07月14日 09:57:17   作者:Alchain奇  
本文主要介紹了mysql enum字段類型使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

為什么使用枚舉

限定值的取值范圍,比如性別(男,女,未知)等。

枚舉類型使用陷阱

1.超級不推薦在mysql中設(shè)置某一字段類型為enum,但是存的值為數(shù)字,比如‘0’,‘1’,‘2’;

  • 解釋1:你會混淆,因為enum可以通過角標取值,但它的角標是從1開始,對于不熟悉這個字段的人這里會出錯
  • 解釋2:enum類型的字段對于0與‘0’有非常大的區(qū)別,如果你是用0當角標做操作,因它沒有這個角標,所要會報錯;如果你使用‘0’這個值去取枚舉值,并做插入操作,你會發(fā)現(xiàn)它竟然會成功,但是插入的結(jié)果是一個“空”(不是null)
  • 解釋3:enum類型對于php等弱語言類型的支持很差,弱語言類型打引號和不打引號的值可能是同一類型,但是對于mysql中enum類型的字段來說,那就不一定是一回事了

結(jié)論:總之,不要拿mysql的enum類型取存一些數(shù)字;如果你一定要使用這個字段去存數(shù)字,請把這個字段定義為int,然后在java代碼中使用枚舉類做一個對于這個字段值范圍的一個限定!(后面有代碼)

2.你可能會報這個錯——Caused by: java.sql.SQLException: Data truncated for column 'Color' at row 1  ;

  • 原因:Jpa默認使用整數(shù)順序值持久化枚舉類型;
  • Mysql中枚舉類型Color定義取值的順序是RED、GREEN、BLUE,因此,當這三個取值持久化到數(shù)據(jù)庫表時,取值分別是0、1、2;
  • 意思就是我們這里存往數(shù)據(jù)庫的數(shù)據(jù)是0、1、2這樣的數(shù)字,而不是RED、GREEN、BLUE字符串, 但是Mysql數(shù)據(jù)庫中定義的是RED、GREEN、BLUE,并沒有其它值所以報錯

解決:在entity中使用@Enumerated(EnumType.STRING)標注你的枚舉類型屬性,如果標注,默認是integer

使用例子:

建表語句為

 CREATE TABLE test4 (  
     id BIGINT UNSIGNED  PRIMARY KEY AUTO_INCREMENT,  
     brand VARCHAR(255) NOT NULL,  
     color ENUM('RED','GREEN','BLUE')
  ) ENGINE = InnoDB; 

Java代碼中,枚舉類

public enum Color {
     RED,  
     GREEN,  
     BLUE  
}

Java代碼中,Javabean

@Entity  
@Table(name="test4") 
public class ClothesRight {
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
    
    @Enumerated(EnumType.STRING)
    private Color color;  
    
    private String brand;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getBrand() {
        return brand;
    }
 
    public void setBrand(String brand) {
        this.brand = brand;
    }
 
    public ClothesRight(Long id, Color color, String brand) {
        super();
        this.id = id;
        this.color = color;
        this.brand = brand;
    }
 
    public Color getColor() {
        return color;
    }
 
    public void setColor(Color color) {
        this.color = color;
    }
 
    public ClothesRight() {
        super();
    }
    
}

簡單使用:

public interface Test4RightRepository extends JpaRepository<ClothesRight, Long>{
 
}
@Autowired
    private Test4RightRepository t4R;
/**
     * 使用@Enumrated()標注字段為枚舉的數(shù)據(jù)
     * 結(jié)果 正確插入RED
     */
    @GetMapping(value="/addclothesright")
    public void GetTest4Right(){
        List<ClothesRight> entities = new ArrayList<>();
        ClothesRight clothes = new ClothesRight();  
        //clothes.setId(1L);
        clothes.setBrand("佐丹奴");  
        clothes.setColor(Color.RED); 
        entities.add(clothes);
        t4R.save(entities);
    }

結(jié)果為:

插入數(shù)字例子:

建表

CREATE TABLE test5num (  
    id BIGINT UNSIGNED  PRIMARY KEY AUTO_INCREMENT,  
     used int(11) DEFAULT NULL COMMENT '0:沒用過  1:已用過  2:不能用'
 )ENGINE = InnoDB; 

Java代碼為:

@Entity
@Table(name="test5num")
public class Test5Num {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    
    private Used used;
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public Used getUsed() {
        return used;
    }
 
    public void setUsed(Used used) {
        this.used = used;
    }
 
    public Test5Num() {
        super();
    }
 
    public Test5Num(Long id, Used used) {
        super();
        this.id = id;
        this.used = used;
    }
    
}
/**
*枚舉類
*/
public enum Used {
	UNUSED(0,"沒用過"),
	USED(1,"已用過"),
	FORBIDDEN(2,"不能用");
	
	private Integer code;
	private String discribe;
	public Integer getCode() {
		return code;
	}
	public String getDiscribe() {
		return discribe;
	}
	private Used(Integer code, String discribe) {
		this.code = code;
		this.discribe = discribe;
	}
}
/**
 * dao層
 */
public interface Test5NumRepository extends JpaRepository<Test5Num, Long>{
 
}
@Autowired
    private Test5NumRepository t5N;
       /**
     * mysql枚舉的字段類型不宜插入數(shù)字,但是需求就是要用數(shù)字,怎么辦?
     * 解決:mysql數(shù)據(jù)類型定義為int,枚舉限定在java代碼中解決
     * 
     */
    @GetMapping("/test5insert")
    public void insertT5(){
        Test5Num t5 = new Test5Num();
        t5.setUsed(Used.USED);
        List<Test5Num> list = new ArrayList<Test5Num>();
        list.add(t5);
        t5N.save(list);
    }

結(jié)果:

到此這篇關(guān)于mysql enum字段類型的謹慎使用的文章就介紹到這了,更多相關(guān)mysql enum字段類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Mysql自增id的這些你可能還不知道

    關(guān)于Mysql自增id的這些你可能還不知道

    這篇文章主要給大家介紹了關(guān)于Mysql自增id的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習或者使用Mysql具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-05-05
  • MySQL 邏輯備份與恢復(fù)測試的相關(guān)總結(jié)

    MySQL 邏輯備份與恢復(fù)測試的相關(guān)總結(jié)

    數(shù)據(jù)庫邏輯備份就是備份軟件按照我們最初所設(shè)計的邏輯關(guān)系,以數(shù)據(jù)庫的邏輯結(jié)構(gòu)對象為單位,將數(shù)據(jù)庫中的數(shù)據(jù)按照預(yù)定義的邏輯關(guān)聯(lián)格式一條一條生成相關(guān)的文本文件,以達到備份的目的。本文將具體介紹MySQL 邏輯備份的相關(guān)概念及如何做恢復(fù)測試。
    2021-05-05
  • MySQL兩種臨時表的用法詳解

    MySQL兩種臨時表的用法詳解

    這篇文章主要介紹了MySQL兩種臨時表的用法詳解,.內(nèi)容比較詳細,這里分享給大家,供大家參考,學(xué)習。
    2017-10-10
  • MySQL數(shù)據(jù)庫存儲引擎介紹及數(shù)據(jù)庫的操作詳解

    MySQL數(shù)據(jù)庫存儲引擎介紹及數(shù)據(jù)庫的操作詳解

    mysql面試中最常問的問題之一:小伙子,你說一下你們公司用的存儲引擎,以及你知道有哪些存儲引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關(guān)于Mysql存儲引擎的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • MySQL并發(fā)更新數(shù)據(jù)時的處理方法

    MySQL并發(fā)更新數(shù)據(jù)時的處理方法

    在后端開發(fā)中我們不可避免的會遇見MySQL數(shù)據(jù)并發(fā)更新的情況,作為一名后端研發(fā),如何解決這類問題也是必須要知道的,同時這也是面試中經(jīng)??疾斓闹R點。
    2019-05-05
  • MySQL復(fù)制問題的三個參數(shù)分析

    MySQL復(fù)制問題的三個參數(shù)分析

    這篇文章主要介紹了MySQL復(fù)制問題的三個參數(shù)分析,幫助大家更好的理解和學(xué)習使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • Mysql主鍵相關(guān)的sql語句集錦

    Mysql主鍵相關(guān)的sql語句集錦

    本文主要搜集總結(jié)了一些和mysql主鍵相關(guān)的sql語句,包括增加主鍵或者更改表的列為主鍵之類的sql語句,希望對大家能有所幫助
    2014-08-08
  • MySQL如何比較兩個表數(shù)據(jù)的差異

    MySQL如何比較兩個表數(shù)據(jù)的差異

    這篇文章主要介紹了MySQL比較兩個表數(shù)據(jù)的差異,這些方式可以根據(jù)具體需求和數(shù)據(jù)結(jié)構(gòu)選擇合適的方法來比較兩個表的數(shù)據(jù)差異,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Navicat連接MySQL提示1045錯誤解決(重置MySQL密碼)

    Navicat連接MySQL提示1045錯誤解決(重置MySQL密碼)

    連接MySQL數(shù)據(jù)庫時難免會遇到1045錯誤,主要是因為用戶輸入的用戶名或密碼錯誤被拒絕訪問,如果不想重裝,需要找回密碼或者重置密碼,這篇文章主要給大家介紹了關(guān)于Navicat連接MySQL提示1045錯誤解決的方法,主要是重置MySQL密碼,需要的朋友可以參考下
    2023-04-04
  • PHP函數(shù)使用說明(補充)

    PHP函數(shù)使用說明(補充)

    PHP函數(shù)使用說明,應(yīng)用舉例,精簡點評,希望對您學(xué)習php有所幫助。
    2010-07-07

最新評論