首先我们会讲到字符集的概念,字符集是指一些字符的集合,而字符编码是指一个字符的编码格式,因此两者的关系可以这样描述,例如:“使用Unicode编码的字符集”,意思就是该字符集中的所有字符都是使用Unicode进行编码的。

接着说一下Unicode,它是一种字符编码,不是字符集,它为每种语言的每个字符设定了统一且唯一的二进制编码。在MySQL5.5及以上版本中支持ucs2、utf8、utf8mb4、utf16、utf32五种Unicode编码的字符集,而在MySQL5.5版本之前,仅支持ucs2和utf8两种Unicode编码的字符集。

MySQL可以为每个列单独指定字符集。我们在创建表时若没有给列单独指定字符集,那么会默认采用创建表时指定的字符集;若创建表时没有指定字符集,那么会默认采用创建库时指定的字符集;若创建库时也没有指定字符集,那么会默认采用MySQL配置文件中指定的字符集。目前MySQL5.5版本配置文件中默认的字符集是latin1。

接下来我们要说一说排序规则,它是指对字符集中不同字符的比较规则。它的命名规则以_ci结尾表示对大小写不敏感,以_cs结尾表示对大小写敏感,以_bin结尾表示二进制的比较。可以对列单独指定排序规则。排序规则不仅影响大小写的比较问题还会影响索引。

char和varchar

两者在声明时都可以指定能存储的字符数,char(N)、varchar(N),这里的N是指字符数而不是字节数,例如将N设置为4,则可以存储4个中文或字母或数字。两者的主要区别是char列的长度固定为创建表时声明的长度,而varchar列的长度则是可变长的。

char(N)长度的列最多可占用的字节数,为该字符集单字符最大占用字节数*N。

上图验证了前面说到的char(N)、varchar(N)的N是指字符数而不是字节数。由于这张表是utf8编码格式的表,这种编码格式下一个中文字符是占用3个字节的,如果N是指代字节,则很明显“测试数据”这四个字符是无法插入的,因为它们需要12个字节才能存储。

另外在插入数据时若插入的字符串尾部包含空格,char会删除掉尾部的这些空格而varchar会保留尾部的这些空格。详见上图,可以看到char对于头部和中间的空格是不做处理的。

为什么char会删除掉尾部空格呢?

这是因为在指定了能存储的字符数后,若插入的数据字符数未达到指定能存储的字符数,则会对这些数据进行右空格填充(也可以理解为进行尾部空格填充),使其长度达到指定能存储的字符数。举个例子,例如插入“测试 ”这个字符串,其长度为3个字符未达到上面定义的4个字符存储长度,MySQL会删除原数据的尾部空格,因为MySQL本身就要进行右空格填充操作,而这个原数据尾部却带有空格,明显会造成冲突。

有人会说,那MySQL只需要填充还缺少的空格数就行了啊。不,MySQL并不会对数据尾部你带几个空格,我需要填充几个空格这种行为做记录,因为没必要设计的这么复杂,因此直接将原数据尾部的空格都干掉,然后看距离达到指定存储的字符还差几个空格,再进行相应数量的右空格填充即可。

在对char列的数据进行检索时,MySQL会自动删除掉原先填充的右空格。这个行为也是可以理解的,因为如果不把自动填充的右空格删除,你所想检索的数据和实际存储的数据根本就不匹配,会导致无法检索出数据的情况。

鉴于此如果我们需要存储的数据尾部本身就带有空格,那么建议使用varchar类型。

附MySQL官方手册对这一块儿的说明:

“The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled. ”

大意为:

“CHAR列的长度固定为创建表时声明的长度。 其长度可以是0到255之间的任意值。当存储CHAR类型的值时,MySQL会用指定长度的空格进行右填充。当检索CHAR类型值时,除非启用 PAD_CHAR_TO_FULL_LENGTH 的SQL模式,否则将会删除掉尾部空格。”

varchar最多能存储多少个字符?

这个问题千万不要想当然,不然结果会出乎你意料。

虽然我们在定义varchar时能够指定其能存储多少字符,但实际varchar能存储的字符数量是受限于其能存储的字节数的,这个限制字节数为65535,就是说被定义为varchar类型的列,最多能存储65535个字节。

这里详细说明下:

①如果是非空的varchar,则实际最多能存储65533个字节,因为还有两个字节是用来标记列长度的(当存储的数据大于255个字节,就需要用2个字节来标记列长度,若小于255个字节,则需要用1个字节来标记列长度);

②如果是可为空的varchar则实际最多能存储65532个字节,因为还需要一个字节用来标记是否为空。

最多能存储字符数的计算:

在utf8编码格式下,将varchar定义为非空,再利用公式:(65535-2)/3=21844余1,就能得到其最多能存储的字符数为21844个。若需要存储的字符串超过了这个部分,则应该根据实际情况来选择用tinytext、mediumtext、text或longtext作为该列的数据类型。

binary和varbinary

两者是用来存储二进制的字符串的。它们与char和varchar的区别如下:

①binary(N)和varbinary(N)中N代表字节而不是字符;

②binary和varbinary的值排序和比较都是按照二进制值来进行的;

③binary的填充字符是0x00,char的填充字符是0x20;

blob和text

两者和varbinary和varchar的区别主要为:

①在blob和text列上创建索引时,必须制定索引的前缀长度;

②blob和text列没有默认值;

③在排序时只使用列的前max_sort_length个字节;

MySQL学习分享-->字符类型

标签:with   排序   还需   规则   文件中   详细说明   配置文件   检索   trie

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/seker/p/6512371.html

mysql字符类型_MySQL学习分享--字符类型相关推荐

  1. mysql查询id为5的数据类型_MySql学习05---数据类型

    MySql支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT.浮点小数数据类型FLOA ...

  2. mysql 中文字符 函数_MySQL基础之字符函数-Go语言中文社区

    本文主要介绍几个MySQL常见的字符函数. 1.length()函数 length函数用于获取值的字节个数.str参数可以是一个字符串.整数.浮点数.布尔值.函数.null等. 注:如果参数值是nul ...

  3. mysql 属于定点数的类型_MySQL浮点数和定点数类型

    MySQL中,存储小数使用的浮点数和定点数类型. 浮点数有两种,单精度浮点类型--FLOAT,双精度浮点数类型--DOUBLE. 定点数只有DECIMAL类型. FLOAT 占用:4字节 有符号:-3 ...

  4. mysql里边字符函数_mysql函数(一.字符函数)

    一.字符函数 1.LENGTH(str)字符长度函数:一个汉字为三个字符 (1)查看某字符串的长度(比如名字) select LENGTH('sunchuangye');    结果:11 (2)根据 ...

  5. mysql ddl脚本_MySQL学习之路(1):SQL脚本语言

    使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器: 安装Mysql workbench客户端,可以以图形化界面管理mysql: 安装p ...

  6. mysql事务变量_mysql学习四之事务、变量、触发器、函数、存储过程

    需求:有一张银行账户表,有A用户给B用户转账:A账户先减少,B账户增加,但是A操作完之后断电了. 解决方案:A减少钱,但是不要立即修改数据表:B收到钱之后,同时修改数据表 事务安全 事务:transa ...

  7. 从mysql学起_MySQL学习从这里出发!

    MySQL数据库开发学习中,想满足一些需求,无疑需要经常与数据打交道,例如,我们在使用IO的一些技术的时候,常常需要将一些数据存储到外部文件,可能大家会问,我们初学的时候常常会简单的保存一些数据到 . ...

  8. Mysql成语数据库_mysql学习笔记

    今天开始学习mysql数据库了,也是第一次在这里写技术笔记,相信好记忆不如烂笔头,就以此来见证自己的成长吧! 首先安装mysql服务器的过程这里就不啰嗦啦,相信大家都懂的,直接进入主题吧,欢迎那些也是 ...

  9. mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考

    本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型. ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定哪 ...

  10. MySql DDL日志_mysql学习日记——数据库基础与基本DDL、DML语句

    # # # 数据库的基本概念 数据库: DataBase (DB).用于存储和管理数据的仓库. 数据库的特点: 1. 持久化存储数据的.其实数据库就是一个文件系统 2. 方便存储和管理数据 3. 使用 ...

最新文章

  1. 型数据保留几位小数_Python数据分析—数据框的简单操作
  2. php 编辑器中使用短代码,php-在WooCommerce短代码输出中更改标记
  3. minifilter
  4. [转]移动端页面开发资源总结及技巧
  5. 音频处理十:( mp3 与wav 格式的相互转换)
  6. 辅助类BinaryTreeNode(二叉树节点)
  7. 登台区无效_使用事务数据复制来重放和测试登台服务器上的生产负载
  8. c# 关于继承类中构造函数的实现
  9. python 按日期筛选数据并计算均值
  10. DaRT启动光盘使用详解
  11. java 云 代码_我 - java代码库 - 云代码
  12. 计算机水平居中,excel表格居中设置可数据还是偏左-excel表格,页面设置选水平居中了,为什么预览时它......
  13. 用c#语言制作点歌程序,c#实现KTV点歌系统
  14. 我从华为身上学到的项目管理经验 -- 概述篇
  15. 羽毛球高远球技术动作要领解码
  16. 4000亿“猪茅”能飞多久?
  17. 魅族的usb计算机连接无法使用,魅族16怎么连接电脑 魅族手机连接电脑无法识别...
  18. [Python] 你的BMI是多少呢?
  19. jvm参数调优_3_问题排查
  20. c语言 游程编码,简单的行程编码-C语言实现

热门文章

  1. python线程和c++线程的区别_python 多线程和C++多线程的区别
  2. android平台网络命令编程,Android网络编程-Socket
  3. 软考中级软件设计师笔记第一章计算机组成与体系结构
  4. mariadb mysql同步_MySQL/MariaDB主主数据同步配置
  5. docker启动mysql容器报错driver failed programming external connectivity on endpoint mysq
  6. Mybatis的xml映射文件,sql的模糊查询的实现(两种方式)占位符拼接,concat关键字
  7. 样本不平衡 pytorch_CVPR2019 | 面对高度不均衡数据如何提高精度?这篇文章有妙招...
  8. .NET中的Lambda表达式与匿名方法
  9. 布局篇(2)—If you love css …
  10. SVM 超平面方程