MySQL到底能有多少個欄位

来源:https://www.cnblogs.com/gjc592/archive/2020/03/31/12609153.html
-Advertisement-
Play Games

今天技術討論群里 “一切隨遇而安”同學看書時出現一個疑問,一個MySQL的表中到底可以有多少個欄位?帶著這個疑問,我們展開了探討,也接著討論了一個單欄位長度的問題。 1. 官方文檔說明 官方文檔的內容如下,主要意思是欄位個數限制達不到理想的4096個,且和欄位類型有關,innodb引擎的欄位上限是1 ...


今天技術討論群里 “一切隨遇而安”同學看書時出現一個疑問,一個MySQL的表中到底可以有多少個欄位?帶著這個疑問,我們展開了探討,也接著討論了一個單欄位長度的問題。

1.  官方文檔說明

官方文檔的內容如下,主要意思是欄位個數限制達不到理想的4096個,且和欄位類型有關,innodb引擎的欄位上限是1017,。

 2.  測試表欄位數限制

2.1  測試innodb引擎表

因官方文檔介紹了innodb表欄位限制是1017,因此可以寫程式進行模擬。思路如下:

a) 創建一張1個 char(1) 類型的innodb表

b)   迴圈往該表新增欄位 直至報錯

我使用的是python 腳本進行測試,腳本如下:

#!/usr/bin/python
# coding=utf-8
import pymysql as mdb
import os

sor_conn = mdb.connect(host='127.0.0.1',port=3306,user='root',passwd='123456')
sor_cur = sor_conn.cursor()

v_sql_d = "drop table  if exists test.test_c ;"   # 為了程式重覆執行,添加判斷

sor_cur.execute(v_sql_d)
sor_conn.commit()
v_sql_c = "create table test.test_c(c1 char(1))  engine=innodb;"
sor_cur.execute(v_sql_c)
sor_conn.commit()
v_id=2
while v_id<50000:
        v_sql_add_c = " alter table test.test_c  add c%d char(1);"%(v_id)

        try:
                sor_cur.execute(v_sql_add_c)
                sor_conn.commit()
        except mdb.Error,e:
                v_cnt = v_id - 1
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                print "MySQL has a limit of %d" %(v_cnt)
                break
        v_id = v_id + 1
sor_conn.close()

運行結果如下:

[root@testdb python_pro]# python test_column.py 
Mysql Error 1117: Too many columns
MySQL has a limit of 1017

在SQLyog客戶端手動驗證也是同樣的結果


 

因此,官方文檔中介紹的MySQL innodb引擎表最多有1017個欄位。

 

 

2.2  測試MYISAM引擎表

因為MySQL中另一種MYISAM引擎的表在MySQL5.7版本之前也是非常重要的存儲引擎,只是後續版本使用越來越少,但是 還是有必要測試一番。

程式思路與測試innodb是均一致,只是將表的引擎進行修改,如下:

#!/usr/bin/python
# coding=utf-8
import pymysql as mdb
import os
import datetime
import time

sor_conn = mdb.connect(host='127.0.0.1',port=3306,user='root',passwd='123456')
sor_cur = sor_conn.cursor()

v_sql_d = "drop table  if exists test.test_c ;"

sor_cur.execute(v_sql_d)
sor_conn.commit()
v_sql_c = "create table test.test_c(c1 char(1))engine=MYISAM ;"
sor_cur.execute(v_sql_c)
sor_conn.commit()
v_id=2
while v_id<50000:
        v_sql_add_c = " alter table test.test_c  add c%d char(1);"%(v_id)

        try:
                sor_cur.execute(v_sql_add_c)
                sor_conn.commit()
        except mdb.Error,e:
                v_cnt = v_id - 1
                print "Mysql Error %d: %s" % (e.args[0], e.args[1])
                print "MySQL has a limit of %d" %(v_cnt)
                break
        v_id = v_id + 1
sor_conn.close()

運行結果如下:

[root@testdb python_pro]# python test_column.py 
Mysql Error 1117: Too many columns
MySQL has a limit of 2598

也就是說MySQL中MyISAM引擎表最多可以存2598個欄位。

 

3.  測試欄位長度限制

大家都知道的一個知識是在MySQL中一行除了blob及text類的大欄位之外,其餘欄位的長度之和不能超過65535,那麼這個是確定的麽,因此再次做一次測試。

3.1  測試UTF8字元集

創建一個只有一個欄位的表,欄位長度為65535 結果居然報錯了,提示最大長度只能是21845,也就是65535/3的量,

/*  測試單欄位長度 上限*/
CREATE  TABLE  test_c1(
c1 VARCHAR(65535)
) ENGINE=INNODB CHARACTER SET utf8;
/* 執行結果 */
錯誤代碼: 1074
Column length too big for column 'c1' (max = 21845); use BLOB or TEXT instead

但是改為21845依舊報錯,原因你仔細品(提示varchar)

CREATE  TABLE  test_c1(
c1  VARCHAR(21845) 
) ENGINE=INNODB CHARACTER SET utf8;

/* 執行結果依舊報錯 */
錯誤代碼: 1118
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

那,在減小一位試試

CREATE  TABLE  test_c1(
c1  VARCHAR(21844) 
) ENGINE=INNODB CHARACTER SET utf8;
/* 終於成功了*/
查詢:create table test_c1( c1 varchar(21844) ) engine=innodb character set utf8

共 0 行受到影響

有圖有真相

 

 3.2  測試latin字元集

因為utf8編碼占3位,因此最大長度只能是21845(-1),那麼latin字元集是不是就能達到65535了

測試如下

CREATE  TABLE  test_c1(
c1  VARCHAR(65535) 
) ENGINE=INNODB CHARACTER SET latin1
/* 結果依舊失望 */
錯誤代碼: 1118
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

在想想上面的情況,一直減下去,發現65532即可正常(原因你繼續品就明白了)

CREATE  TABLE  test_c1(
c1  VARCHAR(65532) 
) ENGINE=INNODB CHARACTER SET latin1;
/* 終於成功了 */
<n>查詢:create table test_c1( c1 varchar(65532) ) engine=innodb character set latin1

共 0 行受到影響

給真相

 

3. 小結

實踐出真知,任何人說的知識點都要思考,必要的時候自己檢驗一番。

表欄位限制

 

表欄位長度限制

 

 在此知識給個匆忙的小結,其中原因不懂的可以查看官方文檔,也是詳細的測試,也可以加群一起討論。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我從一萬二千年前開始寫XAML,這麼多年用了很多各式各樣的工具,現在留在電腦里的、現在還在用的、在寫WPF時用的也就那麼幾個。這篇文章總結了這些工具,希望這些工具可以讓WPF開發者事半功倍。 1. Visual Studio Visual Studio應該無需介紹,它是“面向任何開發者的同類最佳工具 ...
  • 假如有這麼一個數據網關服務服務,客戶端有三種賬號角色(普通用戶、管理員用戶、超級管理員用戶),數據網關針對這三種角色用戶分配不同的數據訪問許可權,那怎麼樣通過IdentityServer4 來實現角色的授權呢?它又是怎樣的一個過程? ...
  • ==耗時8小時左右== 總體設計 ansible playbook目錄結構 入口文件 因為不同的主機配置不同,所以按主機分類設置了3個role NFS服務playbook結構 WEB服務playbook結構 Keepalived+LVS服務playbook結構 執行過程 結果測試 1.查看浮動ip ...
  • 使用方法: 使用示例: ...
  • yum部署zabbix-server4.2 前面寫到過在已有的lnmp環境下源碼部署zabbix-server4.0,這次就寫一篇yum部署zabbix-server+mysql的結合。 環境說明: 1.這裡我所使用的MySQL版本為8版本,系統版本為CentOS7.4系列操作系統 部署MySQL ...
  • 痞子衡前段時間在支持一個i.MXRT1060客戶項目時遇到了LCD顯示有異常亮點的問題,這個問題的定位和排查花了一點時間,整個過程現在回想起來仍覺得有意思。做嵌入式(尤其是軟體)這行主要工作除了寫代碼就是解Bug了,而且很多時候往往是寫代碼容易,解Bug難,所以解Bug能力是衡量一個工程師是否資深的... ...
  • 嵌入式實時操作系統RTOS里實時的衡量指標到底是什麼呢?1s肯定達不到實時,那需要多快呢?100ms,10ms,1ms,還是100us,10us? 還有這些指標是如何測量的呢? 一個關於1553B匯流排消息周期實時性指標的例子 一篇論文中關於1553B匯流排消息周期實時性的指標,從這個例子中可以看出,對 ...
  • 本文(面對的是程式員而非專業資料庫管理員DBA)以MySQL資料庫為研究對象,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支持諸多存儲引擎,而各種存儲引擎對索引的支持也各不相同,因此MySQL資料庫支持多種索引類型,如BTree索引,哈希索引,全文索引等等。為了避免混亂,本文將只關註 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...