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.mzph.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\)遍历每一个…