mysql字符类型_MySQL学习分享--字符类型
首先我们会讲到字符集的概念,字符集是指一些字符的集合,而字符编码是指一个字符的编码格式,因此两者的关系可以这样描述,例如:“使用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学习分享--字符类型相关推荐
- mysql查询id为5的数据类型_MySql学习05---数据类型
MySql支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT.浮点小数数据类型FLOA ...
- mysql 中文字符 函数_MySQL基础之字符函数-Go语言中文社区
本文主要介绍几个MySQL常见的字符函数. 1.length()函数 length函数用于获取值的字节个数.str参数可以是一个字符串.整数.浮点数.布尔值.函数.null等. 注:如果参数值是nul ...
- mysql 属于定点数的类型_MySQL浮点数和定点数类型
MySQL中,存储小数使用的浮点数和定点数类型. 浮点数有两种,单精度浮点类型--FLOAT,双精度浮点数类型--DOUBLE. 定点数只有DECIMAL类型. FLOAT 占用:4字节 有符号:-3 ...
- mysql里边字符函数_mysql函数(一.字符函数)
一.字符函数 1.LENGTH(str)字符长度函数:一个汉字为三个字符 (1)查看某字符串的长度(比如名字) select LENGTH('sunchuangye'); 结果:11 (2)根据 ...
- mysql ddl脚本_MySQL学习之路(1):SQL脚本语言
使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器: 安装Mysql workbench客户端,可以以图形化界面管理mysql: 安装p ...
- mysql事务变量_mysql学习四之事务、变量、触发器、函数、存储过程
需求:有一张银行账户表,有A用户给B用户转账:A账户先减少,B账户增加,但是A操作完之后断电了. 解决方案:A减少钱,但是不要立即修改数据表:B收到钱之后,同时修改数据表 事务安全 事务:transa ...
- 从mysql学起_MySQL学习从这里出发!
MySQL数据库开发学习中,想满足一些需求,无疑需要经常与数据打交道,例如,我们在使用IO的一些技术的时候,常常需要将一些数据存储到外部文件,可能大家会问,我们初学的时候常常会简单的保存一些数据到 . ...
- Mysql成语数据库_mysql学习笔记
今天开始学习mysql数据库了,也是第一次在这里写技术笔记,相信好记忆不如烂笔头,就以此来见证自己的成长吧! 首先安装mysql服务器的过程这里就不啰嗦啦,相信大家都懂的,直接进入主题吧,欢迎那些也是 ...
- mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考
本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型. ******几个通用的简单原则:******* 1. 更小的通常更好.但是要确保没有低估需要存储的值的范围,如果无法确定哪 ...
- MySql DDL日志_mysql学习日记——数据库基础与基本DDL、DML语句
# # # 数据库的基本概念 数据库: DataBase (DB).用于存储和管理数据的仓库. 数据库的特点: 1. 持久化存储数据的.其实数据库就是一个文件系统 2. 方便存储和管理数据 3. 使用 ...
最新文章
- 型数据保留几位小数_Python数据分析—数据框的简单操作
- php 编辑器中使用短代码,php-在WooCommerce短代码输出中更改标记
- minifilter
- [转]移动端页面开发资源总结及技巧
- 音频处理十:( mp3 与wav 格式的相互转换)
- 辅助类BinaryTreeNode(二叉树节点)
- 登台区无效_使用事务数据复制来重放和测试登台服务器上的生产负载
- c# 关于继承类中构造函数的实现
- python 按日期筛选数据并计算均值
- DaRT启动光盘使用详解
- java 云 代码_我 - java代码库 - 云代码
- 计算机水平居中,excel表格居中设置可数据还是偏左-excel表格,页面设置选水平居中了,为什么预览时它......
- 用c#语言制作点歌程序,c#实现KTV点歌系统
- 我从华为身上学到的项目管理经验 -- 概述篇
- 羽毛球高远球技术动作要领解码
- 4000亿“猪茅”能飞多久?
- 魅族的usb计算机连接无法使用,魅族16怎么连接电脑 魅族手机连接电脑无法识别...
- [Python] 你的BMI是多少呢?
- jvm参数调优_3_问题排查
- c语言 游程编码,简单的行程编码-C语言实现
热门文章
- python线程和c++线程的区别_python 多线程和C++多线程的区别
- android平台网络命令编程,Android网络编程-Socket
- 软考中级软件设计师笔记第一章计算机组成与体系结构
- mariadb mysql同步_MySQL/MariaDB主主数据同步配置
- docker启动mysql容器报错driver failed programming external connectivity on endpoint mysq
- Mybatis的xml映射文件,sql的模糊查询的实现(两种方式)占位符拼接,concat关键字
- 样本不平衡 pytorch_CVPR2019 | 面对高度不均衡数据如何提高精度?这篇文章有妙招...
- .NET中的Lambda表达式与匿名方法
- 布局篇(2)—If you love css …
- SVM 超平面方程