mysql varchar 2000能存_mysql 數據庫 varchar 到底可以存多少數據呢,長文慎入

一、關于UTF-8 UTF-8 Unicode Transformation Format-8bit。是用以解決國際上字符的一種多字節編碼。 它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。 UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。 UTF-8編碼的文字可以在各國支持UTF8字符集額的瀏覽器上顯示。 如果是UTF8編碼,則在外國人的英文IE也能顯示中文,他們無需下載IE的中文語言支持包。 二、關于GBK GBK 是國家標準GB2312基礎上擴容后兼容GB2312的標準。 GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。 GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBK大。 三、關于utf8mb4 MySql 5.5 之前,UTF8 編碼只支持1-3個字節,只支持BMP這部分的unicode編碼區,BMP是從哪到哪? 戳這里 基本就是 0000 ~ FFFF 這一區。 從MySQL 5.5 開始,可支持4個字節UTF編碼utf8mb4,一個字符最多能有4字節,所以能支持更多的字符集。 utf8mb4 is a superset of utf8 tf8mb4兼容utf8,且比utf8能表示更多的字符。 至于什么時候用,看你做的什么項目了。。。 在做移動應用時,會遇到IOS用戶在文本的區域輸入emoji表情,如果不做一定處理,就會導致插入數據庫異常。 四、漢字長度與編碼有關 MySql 5.0 以上的版本: 1、一個漢字占多少長度與編碼有關: UTF-8:一個漢字 = 3個字節,英文是一個字節 GBK: 一個漢字 = 2個字節,英文是一個字節 2、varchar(n) 表示n個字符,無論漢字和英文,MySql都能存入 n 個字符,僅實際字節長度有所區別。 3、MySQL檢查長度,可用SQL語言 SELECT LENGTH(fieldname) FROM tablename 五、實際測試 1、首先使用utf8 創建 str_test 表。 CREATE TABLE `str_test` ( `name_chn` varchar(20) NOT NULL, `name_en` varchar(20) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8 然后插入值 mysql> insert into str_test values ('我愛Ruby', 'I Love Ruby!'); Query OK, 1 row affected (0.02 sec) 打開irb >> "我愛Ruby".size => 6 >> "I Love Ruby!".size => 12 >> 從MySQL中查詢出來的結果,對比 mysql> select * from str_test; +------------+--------------+ | name_chn | name_en | +------------+--------------+ | 我愛Ruby | I Love Ruby! | +------------+--------------+ 1 row in set (0.02 sec) mysql> select length(name_chn) from str_test; +------------------+ | length(name_chn) | +------------------+ | 10 | +------------------+ 1 row in set (0.01 sec) 3[一個漢字一字節] * 2 + 1[一個英文一字節] * 4 = 10 mysql> select length(name_en) from str_test; +-----------------+ | length(name_en) | +-----------------+ | 12 | +-----------------+ 1 row in set (0.00 sec) 10[一個英文一字節] * 1 + 2[空格一字節] * whitespace = 12 2、使用 GBK 做測試 創建表 CREATE TABLE `str_test` ( `name_chn` varchar(20) NOT NULL, `name_en` varchar(20) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk 插入數據,并且測試 mysql> insert into str_test values ('我愛Ruby', 'I Love Ruby!'); Query OK, 1 row affected (0.00 sec) mysql> select * from str_test; +------------+--------------+ | name_chn | name_en | +------------+--------------+ | 我愛Ruby | I Love Ruby! | +------------+--------------+ 1 row in set (0.01 sec) GBK 中文是兩個字節,英文是一個字節。 mysql> select length(name_chn) from str_test; +------------------+ | length(name_chn) | +------------------+ | 8 | +------------------+ 1 row in set (0.00 sec) 2[中文兩個字節] * 2 + 4[英文一個字節] * 1 = 8 mysql> select length(name_en) from str_test; +-----------------+ | length(name_en) | +-----------------+ | 12 | +-----------------+ 1 row in set (0.00 sec) 10[英文一個字節] * 1 + 2[空格一個字節] * whitespace = 12 六、關于varchar 最多能存多少值 mysql的記錄行長度是有限制的,不是無限長的,這個長度是64K,即65535個字節,對所有的表都是一樣的。 MySQL對于變長類型的字段會有1-2個字節來保存字符長度。 當字符數小于等于255時,MySQL只用1個字節來記錄,因為2的8次方減1只能存到255。 當字符數多余255時,就得用2個字節來存長度了。 在utf-8狀態下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。 在gbk狀態下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1 使用 utf-8 創建 mysql> CREATE TABLE `str_test` ( -> `id` tinyint(1) NOT NULL, -> `name_chn` varchar(21845) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 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 `str_test` ( -> `id` tinyint(1) NOT NULL, -> `name_chn` varchar(21844) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=utf8 -> -> -> ; Query OK, 0 rows affected (0.06 sec) 使用gbk創建 當存儲長度為 32768 失敗~ mysql> CREATE TABLE `str_test` ( -> `id` tinyint(1) NOT NULL, -> `name_chn` varchar(32768) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk -> ; ERROR 1074 (42000): Column length too big for column 'name_chn' (max = 32767); use BLOB or TEXT instead 當存儲長度為 32767 失敗~ mysql> CREATE TABLE `str_test` ( -> `id` tinyint(1) NOT NULL, -> `name_chn` varchar(32767) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk -> ; 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 當存儲長度為 32766 成功~ mysql> CREATE TABLE `str_test` ( -> `id` tinyint(1) NOT NULL, -> `name_chn` varchar(32766) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk -> ; Query OK, 0 rows affected (0.03 sec) smallint 用兩個字節存儲,所以 2[smallint] + 32766 * 2[varchar存儲長度] + 2[2個字節來存長度] > 65535 所以失敗~ mysql> CREATE TABLE `str_test` ( -> `id` smallint(1) NOT NULL, -> `name_chn` varchar(32766) NOT NULL -> ) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk -> ; 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 七、數值類型所占的字節 類型 所占字節 int 4 字節 smallint 2 字節 tinyint 1 字節 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. 翻譯為中文 使用二進制格式將9個十進制(基于10)數壓縮為4個字節來表示DECIMAL列值。 每個值的整數和分數部分的存儲分別確定。 每個9位數的倍數需要4個字節,并且“剩余的”位需要4個字節的一部分。 下表給出了超出位數的存儲需求: Leftover Digits Number Of Bytes 0 0 1 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 那:decimal(10,2)占幾個字節? 1、首先 10 指的是整數與小數部分的總長度, 2指的是小數部分的長度。那么整數部分就只有 10 - 2 = 8 位 2、因為整數與小數的存儲市各自獨立確定的,所以他們各自所占用空間的綜合就是所占的總空間了。 3、對表可知,整數部分8位占了4個字節,小數部分2位占了1個字節,所以decimal(10,2)總共占了 4 + 1 = 5 個字節。 4、decimal(6,2) 整數部分(6 - 2 = 4) 位占2字節,小數部分2位占1字節,總共占3字節。 八、總結 varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535。 UTF-8:一個漢字 = 3個字節,英文是一個字節 GBK: 一個漢字 = 2個字節,英文是一個字節 在utf-8狀態下,漢字最多可以存 21844個字符串, 英文也為 21844個字符串。 在gbk狀態下,漢字最多可以存32766個字符串,英文也為21844個字符串。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536907.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

教程 | 如何利用C++搭建個人專屬的TensorFlow

在開始之前,首先看一下最終成型的代碼: 分支與特征后端(https://github.com/OneRaynyDay/autodiff/tree/eigen)僅支持標量的分支(https://github.com/OneRaynyDay/autodiff/tree/master)這個項目是我與 Min…

docker kali安裝mysql_kali安裝docker(有效詳細的教程) ——vulhub漏洞復現 001

前記:博主有著多次安裝docker的豐富經驗,曾經為了在kali成功安裝docker花費不少時間。在kali2016.3一直到最新的kali2019.4都通吃!所以跟著下面的步驟走,絕對不會出錯。(該機子此前沒裝過docker,并且配置好了kali更新源…

PDF文件如何轉成markdown格式

百度上根據pdf轉makrdown為關鍵字進行搜索,結果大多數是反過來的轉換,即markdown文本轉PDF格式。 但是PDF轉markdown的解決方案很少。 正好我工作上有這個需求,所以自己實現了一個解決方案。 下圖是一個用PDF XChange Editor打開的PDF文件&am…

kangle支不支持PHP_【轉載】PHP調用kangle的API

摘要:根據管理的API公布寫了一個類封裝了一個操作集合,這是一個kangleAPI的一個封...根據管理的API公布寫了一個類封裝了一個操作集合,這是一個kangleAPI的一個封裝吧,是在其他地方看到的,接口包含獲取easypanel的信息…

ES6 學習筆記(一)let,const和解構賦值

let和const let和const是es6新增的兩個變量聲明關鍵字,與var的不同點在于: (1)let和const都是塊級作用域,在{}內有效,這點在for循環中非常有用,只在循環體內有效。var為函數作用域。 &#xff0…

mysql數據庫容量和性能_新品速遞丨容量盤性能提升超 300%,數據庫支持 MySQL 8.0...

2關系型數據庫 MySQL Plus支持 MySQL 8.0 內核及 XtraBackup 物理在線遷移方式關系型數據庫服務 MySQL Plus 發布新版本 1.0.6 , 新增多項功能,提升了集群自動化運維能力。主要升級有:- 支持 MySQL 8.0 內核:根據官方測試&#xf…

10. Python面向對象

Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。如果接觸過java語言同學應該都知道,Java面向對象三大特征是:封裝、繼承、多態。Python面向對象也有一些特征,接下來我…

mysql聚簇索引 和主鍵的區別_[MySQL] innoDB引擎的主鍵與聚簇索引

MysqL的innodb引擎本身存儲的形式就必須是聚簇索引的形式,在磁盤上樹狀存儲的,但是不一定是根據主鍵聚簇的,有三種情形:1. 有主鍵的情況下,主鍵就是聚簇索引2. 沒有主鍵的情況下,第一個非空null的唯一索引就是聚簇索引3. 如果上面都沒有,那么就是有一個隱藏的row-id作為聚簇索引…

前端頁面:一直報Cannot set property 'height' of undefined

1、出現錯誤的例子,只拷貝了項目中關鍵出現問題的部分 例子中明明寫了styleheight:16px這個屬性,但是為什么還說height未定義呢 通過打印發現:cks.each(function () { autoTextAreaHeight($(this)); });中的$(this)取出來…

mysql表在線轉成分區表_11g普通表在線轉換分區表

本帖最后由 燈和樹 于 2016-5-4 14:58 編輯由于業務系統數據量增大,對其用戶表在線完成分區表轉換過程,記錄如下,11g數據庫支持。創建過渡分區表根據USER_ID創建分區表CREATE TABLE SDP_SMECD.TEST_T_USER_ID(USER_ID NUMBER(13) …

tiger4444/rabbit4444后綴勒索病毒怎么刪除 能否百分百恢復

上海某客戶中了tiger4444的勒索病毒,找到我們后,一天內全部恢復完成。說了很多關于勒索病毒的事情,也提醒過大家,可總是有人疏忽,致使中招后,丟錢丟面子,還丟工作。 那么要怎樣預防呢與處理呢&a…

mysql遠程一會不用卡住_連接遠程MySQL數據庫項目啟動時,不報錯但是卡住不繼續啟動的,...

連接遠程MySQL數據庫項目啟動時,不報錯但是卡住不繼續啟動的,2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factory.support.DefaultListableBeanFactory.doGetBean():251 -Returning cached instance of singleton bean ‘org.spring…

GPT-5、開源、更強的ChatGPT!

年終歲尾,正值圣誕節熱鬧氣氛的OpenAI寫下了2024年的發展清單。 OpenAI聯合創始人兼首席執行官Sam Altman在社交平臺公布,AGI(稍晚一些)、GPT-5、更好的語音模型、更高的費率限制; 更好的GPTs;更好的推理…

CentOS_7 安裝MySql5.7

2019獨角獸企業重金招聘Python工程師標準>>> 下載mysql的源 wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm 安裝yum庫 yum localinstall -y mysql57-community-release-el7-7.noarch.rpm 安裝MySQL yum install -y mysql-community-…

python查詢mysql decimal報錯_python讀取MySQL數據表時,使用ast模塊轉換decimal格式數據的坑...

概述MySQL中常用的數據格式有tinyint()、int()、float()、double()、decimal() 、varchar、enum()、datetime;小數格式中decimal比較常用,因為更加精確,這里就以decimal為例。從MySQL中讀取了一行數據,內容為:(17479, datetime.da…

性能測試總結(一)---基礎理論篇(轉載)

隨著軟件行業的快速發展,現代的軟件系統越來越復雜,功能越來越多,測試人員除了需要保證基本的功能測試質量,性能也隨越來越受到人們的關注。但是一提到性能測試,很多人就直接連想到Loadrunner。認為LR就等于性能測試&a…

java listen_JavaWeb之Filter、Listener

昨天和大家介紹了一下JSON的用法,其實JSON中主要是用來和數據庫交互數據的。今天給大家講解的是Filter和Listener的用法。一、Listenner監聽器1.1、定義Javaweb中的監聽器是用于監聽web常見對象HttpServletRequest,HttpSession,ServletContext。1.2、監聽器的作用監…

BFC的概念及作用

在了解什么是BFC之前,首先得明白什么是Box , Formatting Context (一個決定如何渲染文檔的容器)的概念 Box: CSS布局的基本單位 Box是 CSS 布局的對象和基本單位, 直觀點來說, 就是一個頁面是由很多個 Box組成的&#…

bitcount java_java-Long.bitCount()如何找到設置的位數?

讓我們以255為例.我們將這些位組合在一起.首先,我們從255開始,為0b1111.1111(二進制為8 1)第一行代碼是:i i - ((i > > > 1) & 0x5555555555555555L);這條線正在梳理每對1.由于我們有8個1,所以我們希望組合成對,并得到2,2,2,2之類的東西.由于它是二進…

Luogu P2463 [SDOI2008]Sandy的卡片

題目鏈接 \(Click\) \(Here\) 真的好麻煩啊。。事實證明,理解是理解,一定要認認真真把板子打牢,不然調鍋的時候真的會很痛苦。。(最好是八分鐘能無腦把\(SA\)碼對的程度\(QAQ\)) 這個題最開始我想的是\(RMQ\)遍歷每一個…