MySQL數據類型的驗證

来源:http://www.cnblogs.com/ivictor/archive/2016/04/12/5381870.html
-Advertisement-
Play Games

CHAR char (M) M字元,長度是M*字元編碼長度,M最大255。 驗證如下: VARCHAR VARCHAR(M),M同樣是字元,長度是M*字元編碼長度。它的限制比較特別,行的總長度不能超過65535位元組。 註意,以上表的預設字元集是latin1,字元長度是1個位元組,所以對於varchar ...


CHAR

char (M) M字元,長度是M*字元編碼長度,M最大255。

驗證如下:

mysql> create table t1(name char(256)) default charset=utf8;
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use BLOB or TEXT instead
mysql> create table t1(name char(255)) default charset=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(repeat('',255));
Query OK, 1 row affected (0.00 sec)

mysql> select length(name),char_length(name) from t1;
+--------------+-------------------+
| length(name) | char_length(name) |
+--------------+-------------------+
|          765 |               255 |
+--------------+-------------------+
1 row in set (0.00 sec)

 

VARCHAR

VARCHAR(M),M同樣是字元,長度是M*字元編碼長度。它的限制比較特別,行的總長度不能超過65535位元組。

mysql> create table t1(name varchar(65535));
ERROR 1118 (42000): 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
mysql> create table t1(name varchar(65534));
ERROR 1118 (42000): 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
mysql> create table t1(name varchar(65533));
ERROR 1118 (42000): 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
mysql> create table t1(name varchar(65532));
Query OK, 0 rows affected (0.08 sec)

註意,以上表的預設字元集是latin1,字元長度是1個位元組,所以對於varchar,最大隻能指定65532位元組的長度。

如果是指定utf8,則最多只能指定21844的長度

mysql> create table t1(name varchar(65532)) default charset=utf8;
ERROR 1074 (42000): Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
mysql> create table t1(name varchar(21845)) default charset=utf8;
ERROR 1118 (42000): 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
mysql> create table t1(name varchar(21844)) default charset=utf8;
Query OK, 0 rows affected (0.07 sec)

 

註意:行的長度最大為65535,只是針對除blob,text以外的其它列。

mysql> create table t1(name varchar(65528),hiredate datetime) default charset=latin1;
ERROR 1118 (42000): 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
mysql> create table t1(name varchar(65527),hiredate datetime) default charset=latin1;
Query OK, 0 rows affected (0.01 sec)

確實,datetime占了5個位元組。

 

TEXT,BLOB

mysql> create table t1(name text(255));
Query OK, 0 rows affected (0.01 sec)

mysql> create table t2(name text(256));
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `name` tinytext
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `name` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

通過上面的輸出可以看出text可以定義長度,如果範圍小於28(即256)則為tinytext,如果範圍小於216(即65536),則為text, 如果小於224,為mediumtext,小於232,為longtext。

上述範圍均是位元組數。

如果定義的是utf8字元集,對於text,實際上只能插入21845個字元

mysql> create table t1(name text) default charset=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(repeat('',21846));
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t1 values(repeat('',21845));
Query OK, 1 row affected (0.05 sec)

 

DECIMAl

關於Decimal,官方的說法有點繞,

Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes. Storage for the integer and fractional parts of each value are determined separately. Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes. The storage required for excess digits is given by the following table.

還提供了一張對應表

對於以上這段話的解讀,有以下幾點:

1. 每9位需要4個位元組,剩下的位數所需的空間如上所示。

2. 整數部分和小數部分是分開計算的。

譬如 Decimal(6,5),從定義可以看出,整數占1位,整數占5位,所以一共占用1+3=4個位元組。

如何驗證呢?可通過InnoDB Table Monitor

如何啟動InnoDB Table Monitor,可參考:http://dev.mysql.com/doc/refman/5.7/en/innodb-enabling-monitors.html

mysql> create table t2(id decimal(6,5));
Query OK, 0 rows affected (0.01 sec)

mysql> create table t3(id decimal(9,0));
Query OK, 0 rows affected (0.01 sec)

mysql> create table t4(id decimal(8,3));
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB;
Query OK, 0 rows affected, 1 warning (0.01 sec)

結果會輸出到錯誤日誌中。

查看錯誤日誌:

對於decimal(6,5),整數占1位,小數占5位,一共占用空間1+3=4個位元組

對於decimal(9,0),整數部分9位,每9位需要4個位元組,一共占用空間4個位元組

對於decimal(8,3),整數占5位,小數占3位,一共占用空間3+2=5個位元組。

 

至此,常用的MySQL數據類型驗證完畢~

對於CHAR,VARCHAR和TEXT等字元類型,M指定的都是字元的個數。對於CHAR,最大的字元數是255。對於VARCHAR,最大的字元數與字元集有關,如果字元集是latin1,則最大的字元數是65532(畢竟每一個字元只占用一個位元組),對於utf8,最大的字元數是21844,因為一個字元占用三個位元組。本質上,VARCHAR更多的是受到行大小的限制(最大為65535個位元組)。對於TEXT,不受行大小的限制,但受到自身定義的限制。

 


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

-Advertisement-
Play Games
更多相關文章
  • 第一次做移動端的頁面,遇到的第一個問題就是移動端的輪播圖。其實輪播圖的插件有很多,但是完全滿足需求的並不容易找。 需求: 1.實現基本的觸屏輪播圖效果 2.傳入非標準比例的圖片,可以自動平鋪(有時候圖片可能比例略有偏差,當然例子里的圖是隨便找的,平鋪之後不能看呀) 3.輪播圖模塊能實現自適應,按照固 ...
  • 實例:ORACLE到ORACLE的數據傳遞 編寫job.xml文件,添加變數參數 執行datax.py文件時記得帶參數 格式:./datax.py –p"-Ddbname=*** -Dip=***" job.xml 實現指定的列名數據傳遞 修改reader裡面的colums和writer裡面的col... ...
  • 這篇隨筆用來記錄資料庫的學習,隨時更新補充,主要寫一些比較少關註的內容 PERSISTED: 說明物理存儲計算列的值(書本上的解釋,什麼鬼意思...) 現實操作中,CHECK、FOREIGN KEY 和 NOT NULL 約束要求計算列是持久化(PERSISTED)的。 大概它的作用就是這個吧? A ...
  • 最近項目用到了對oracle大欄位的讀寫,小白在這裡記錄下,方便自己以後用到,也希望對其他朋友有一點幫助。 由於項目的原因,這裡的blob只是對xml報文的讀寫,並沒有涉及到保存圖片等,因此下麵涉及的方法可能不全面,如有需要請自行查看其它大神博客。 一、讀blob 這裡對blob的讀是直接在資料庫建 ...
  • 修改用戶密碼 刷新系統許可權 ...
  • 1、從資料庫中檢索出的數據往往並不是最後要展示的格式,可以在資料庫端或者客戶端應用程式中完成轉換和格式化,但一般說來,在資料庫伺服器中完成要快很多。 2、拼接欄位:將幾個值連接到一起構成單個值。Oracel使用“||”連接,不支持“+”。例如: (1)別名:在欄位名後面加上“ AS 新列名”,重新賦 ...
  • 我們的項目用到了spring框架和mongdb資料庫,隨著mongodb升級到3.0已有半年時間,我們也開始隨之升級,但是3.0的用戶驗證有所更改,導致原來的很多配置無法再用。 經過幾天的嘗試後,終於成功的用spring配置驗證。 升級用了兩個新的jar包,分別是pring-data-mongodb ...
  • 簡介: Mysql 中提供了多種類型的日誌文件,分別反映 Mysql 的不同信息,瞭解它們很有必要。 1、Error log ( 錯誤日誌 ) 錯誤日誌記錄了 Mysql Server 運行過程中所有較為嚴重的警告和錯誤信息,以及 Mysql Server 每次啟動和關閉的詳細信息。 在預設情況下, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...