中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有關mysql的坑有哪些

發布時間:2021-10-21 15:52:59 來源:億速云 閱讀:171 作者:iii 欄目:編程語言

這篇文章主要介紹“有關mysql的坑有哪些”,在日常操作中,相信很多人在有關mysql的坑有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”有關mysql的坑有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、前言

對于從事互聯網開發的同學來說,mysql可謂是再熟悉不過的了。無論是DBA、開發或測試,基本上天天要跟它打交道,很多同學可能已經身經百戰了。但是,筆者遇到過的這些坑不知道你們都經歷過沒?

二、有符號和無符號

以前我們公司在項目開發之初制定開發規范時,對mysql的int類型字段定義成有符號,還是無符號問題專門討論過。

觀點一:

對于能夠確定里面存的值一定是正數的字段,定義成UNSIGNED無符號的,可以節省一半的存儲空間。創建無符號字段的語句如下:

create table test_unsigned(a int UNSIGNED, b int UNSIGNED);

觀點二:

建議都定義成有符號的,使用起來比較簡單,mysql默認int類型就是有符號的,創建有符號字段的語句如下:

create table test_signed(a int);insert into test_signed values(-1);

執行結果:

有關mysql的坑有哪些

在字段a中插入-1,我們看到是可以操作成功的。

這兩個方案,經過我們激烈討論之后,選擇了使用有符號定義int類型字段。為什么呢?

create table test_unsigned(a int UNSIGNED, b int UNSIGNED);insert into test_unsigned values(1,2);

先創建test_unsigned表,里面包含兩個無符號字段a和b,再插入一條數據a=1,b=2

select b - a from test_unsigned;

沒有問題,返回1

但是如果sql改成這樣:

select a - b from test_unsigned;

執行結果:

有關mysql的坑有哪些

報錯了。。。

所以,在使用無符號字段時,千萬要注意字段相減出現負數的坑,建議還是使用有符號字段,避免不必要的問題。

三、自動增長

建過表的同學都知道,對于表的主鍵可以定義成自動增長的,這樣一來,就可以交給數據庫自己生成主鍵值,而無需在代碼中指定,而且生成的值是遞增的。一般情況下,創建表的語句如下:

create table test_auto_increment (a int auto_increment primary key);

但如果改成這樣的會怎樣?

create table test_auto_increment (a int auto_increment);

執行結果:

有關mysql的坑有哪些

報錯了。。。

截圖中沒有全部顯示出來,完整的提示語是這樣的:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key, Time: 0.006000

意思是自動增長字段,必須被定義成key,所以我們需要加上primary key。

此外,還有一個有趣的實驗:

insert into test_auto_increment(a) values (null),(50),(null),(8),(null);

大家猜猜執行結果會是什么樣的?

有關mysql的坑有哪些

第一個null插入1,然后按真實的數字大小排序后插入,后面兩個null,是在最大的數字上面加1。

再看看這條sql主鍵中插入負數,能執行成功嗎?

insert into test_auto_increment values(-3);

答案是可以,主鍵可以插入負數。

有關mysql的坑有哪些

還有這條sql呢,主鍵中插入0?

insert into test_auto_increment values(0);

執行結果:

有關mysql的坑有哪些

也可以執行成功,但是沒有插入數據

四、字段長度

我們在創建表的時候,給字段定義完類型之后,緊接著需要指定字段的長度,比如:varchar(20),biginit(20)等。那么問題來了,varchar代表的是字節長度,還是字符長度呢?

create table test_varchar(a varchar(20));insert into test_varchar values('蘇三說技術');select length(a),CHARACTER_LENGTH(a) from test_varchar;

執行后的結果:

有關mysql的坑有哪些

我們看到中文的5個字length函數統計后長度為15,代表占用了15個字節,而使用charcter_length函數統計長度是5,代表有5個字符。所以varchar代表的是字符長度,因為有些復雜的字符或者中文,一個字節表示不了,utf8編碼格式的一個中文漢字占用3個字節。不同的數據庫編碼格式,占用不同的字節數對照表如下:

有關mysql的坑有哪些

mysql除了varchar和char是代表字符長度之外,其余的類型都是代表字節長度。

int(n) 這個n表示什么意思呢?從一個列子出發:

create table test_bigint (a bigint(4) ZEROFILL);insert into test_bigint values(1);insert into test_bigint values(123456);select * from test_bigint;

ZEROFILL表示長度不夠填充0

執行結果:

有關mysql的坑有哪些

mysql常用數字類型字段占用字節數對照表:

有關mysql的坑有哪些

從表中可以看出bigint實際長度是8個字節,但是我們定義的a顯示4個字節,所以在不滿4個字節時前面填充0。滿了4個字節時,按照實際的長度顯示,比如:123456。但是,需要注意的是,有些mysql客戶端即使滿了4個字節,也可能只顯示4個字節的內容,比如顯示:1234。

所以bigint(4),這里的4表示顯示的長度為4個字節,實際長度還是8個字節。

五、忽略大小寫

我們知道在英文字母中有大小寫問題,比如:a 和 A 是一樣的嗎?我們認為肯定是不一樣的,但是數據庫是如何處理的呢?

create table test_a(a varchar(20));insert into test_a values('a');insert into test_a values('A');select * from test_a where a = 'a';

執行結果是什么呢?

有關mysql的坑有哪些

本以為只會返回a,但是實際上把A也返回了,這是為什么呢?

有關mysql的坑有哪些

該表默認的Collation是utf8_general_ci,這種Collation會忽略大小寫,所以才會出現查詢小寫字母a的值,意外把大寫字母A的值也查詢出來了。

那么如果我們只想查詢出小寫a的值該怎么辦?先看看mysql支持哪些Collation?

show collation;

有關mysql的坑有哪些

從上圖中我們可以找到utf8_bin,這個表示二進制格式的數據,我們設置成種類型的試試。

有關mysql的坑有哪些

修改一下字段類型

ALTER TABLE test_a MODIFY COLUMN a VARCHAR(20) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

再查看一下數據

select * from test_a where a = 'a';

執行結果:

有關mysql的坑有哪些

果然,結果對了。

六、特殊字符

筆者之前做項目的時候,提供過一個留言的功能,結果客戶端用戶輸入了一個emoji表情,直接導致接口報錯了。

有關mysql的坑有哪些

最后定位原因是由于當時數據庫和表的字符編碼都是用的utf8,mysql的utf8編碼的一個字符最多3個字節,但是一個emoji表情為4個字節,所以utf8不支持存儲emoji表情。

該如何解決這個問題呢?

將字符編碼改成utf8mb4,utf8mb4最多能有4字節,不過,在mysql5.5.3或更高的版本才支持。

在mysql 的配置文件 my.cnf 或 my.ini 配置文件中修改如下:

[client]default-character-set = utf8mb4[mysqld]character-set-server = utf8mb4collation-server     = utf8mb4_general_ci

重啟MySQL,然后使用以下命令查看編碼,應該全部為utf8mb4,這是修改整個數據庫的編碼方式。

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';ji

結果為:

有關mysql的坑有哪些

也可以單獨修改某張表的編碼方式:

alter table test_a convert to character set utf8mb4 collate utf8mb4_bin;

以及修改某個字段的編碼方式:

ALTER TABLE test_a CHANGE a a VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

此外,建議同學們在創建數據庫和表的時候字符編碼都定義成utf8mb4,避免一些不必要的問題。

到此,關于“有關mysql的坑有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤峰市| 北海市| 教育| 威远县| 和政县| 博乐市| 绥芬河市| 德格县| 东乡族自治县| 手游| 西藏| 普定县| 郸城县| 无为县| 尉犁县| 恩施市| 天祝| 德令哈市| 桂平市| 平陆县| 三台县| 定襄县| 成都市| 肥乡县| 缙云县| 囊谦县| 红原县| 库尔勒市| 图片| 张掖市| 温泉县| 香格里拉县| 丰台区| 定结县| 江津市| 沙坪坝区| 泰和县| 蓬溪县| 桂阳县| 英山县| 沧州市|