一、关于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个字符串。

mysql varchar 2000能存_mysql 数据库 varchar 到底可以存多少数据呢,长文慎入相关推荐

  1. linux mysql 实战_Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06

    Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06 视频教程学习地址 Oracle/MySQL数据库学习专用QQ群:336282998.189070296 学完风哥本课程能熟悉 ...

  2. mysql部门人员排序设计_MySQL数据库访问性能优化

    MYSQL应该是最流行的WEB后端数据库.大量应用于PHP,Ruby,Python,Java 等Web语言开发项目中,无论NOSQL发展多么快,都不影响大部分架构师选择MYSQL作为数据存储. MYS ...

  3. mysql周德伟课后答案_mysql数据库搜索

    MySQL 数据库考试试题 及答案精编 Document number:WTT-LKK-GBB-08921-EIGG-22986 专业:移动通信 科目:MySQL 数据库 一.单项选择题 1.以下聚合 ...

  4. mysql黑窗口常用命令_mysql数据库常用命令

    1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show ...

  5. mysql insert 不需要日志_MySQL数据库性能优化(1)「转」

    1.MySQL概述 从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案.关系型数据库的选型将以创业公司.互联网行业使用最广泛的MySQL数据为目标,但是MySQL的安装过程 ...

  6. web mysql 界面表命名规范_MySql数据库表字段命名及设计规范

    1.设计原则 1) 标准化和规范化web 数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)一般被认为在性能.扩展性和数据完整性方面达到了最 ...

  7. mysql表设计 列命名_MYSQL数据库字段命名及设计规范

    1.设计原则 1) 标准化和规范化 数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡 ...

  8. mysql建立修改表存储过程_MySQL数据库创建、表的创建、存储过程、触发器

    一.基本内容 (1) 使用SQL语句创建数据库: (2) 为数据库分配管理权限: (3) 定义表和数据库的完整性,student(学生表),course(课程表)和 sc(学生选课表), 并设置各个表 ...

  9. mysql如何对字段加密_Mysql 数据库字段加密

    1 数据库字段加密: 2 4.20. 数据加密 3 数据库中有很多敏感字段,不允许随意查看,例如开发人员,运维人员,甚至DBA数据库管理员.另外加密主要是防止被***脱库(盗走) 4 敏感数据加密有很 ...

最新文章

  1. android异常相机处理器,Cordova Android Camera-提供非法参数异常
  2. 论海明威的存在主义宗教意识——存在主义虚无主义。注:部分观点个人不赞同...
  3. SLAM:SLAM之VSLAM的简介
  4. 西伯利亚(Siberia)冷空气
  5. 车联网大数据框架_大数据基础:ORM框架入门简介
  6. 3 天撸了个数据中台出来,我飘了~
  7. Linux Ubuntu 18.04安装JDK、Hadoop、Hbase以及图形界面
  8. RabbitMQ生产者和消费者Java实现
  9. HDU 6162 2017 多校训练:Ch's gift(树链剖分)
  10. 使用和编辑Mac的特殊触摸板命令?你值得一看
  11. BaKoMa Tex Word 的使用
  12. 可扩展标记语言用户界面语言--XUL的定义及标签(详细)
  13. shell中用grep查找并且不输出_grep无法查找shell传过来的变量?先注意一下文本格式吧!...
  14. 数据结构—双向链表的基本操作
  15. 题目 1180: 不容易系列
  16. 思科路由器配置GRE隧道
  17. Java实现微信的申请退款功能
  18. (8.1.5.5)Android Testing Support Library翻译之Espresso 意图
  19. SpringBoot——SpringBoot集成Swagger生成API文档
  20. 查询出部门编号为30的所有销售的详细信息

热门文章

  1. cropper初始化_jQuery.cropper中文API详解
  2. python自动化_python自动化测试-Behave框架的用法介绍 - python测试学习
  3. python矩阵函数_NumPy 矩阵库函数
  4. linux显示磁盘使用情况命令,Linux中监控磁盘分区和使用情况的几个工具
  5. linux 临时文件 锁,linux – 无法使用文件描述符flock锁定文件
  6. 语言nomogram校准曲线图_预测模型的概率校准
  7. 从数据传输的角度辨析表单设计时的 get 和 post 提交方法
  8. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
  9. Springboot国际化信息(i18n)解析
  10. 编译原理:正规式转变成DFA算法