MySQL 字符类型
字符类型
MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用char和varchar即可
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255字节 | 定长字符串 |
| VARCHAR | 0-65535 字节 | 变长字符串 |
| TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255字节 | 短文本字符串 |
| BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
| TEXT | 0-65 535字节 | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
基本定义
对于字符类型而言,其指定宽度均为存入宽度,以字符为单位。
create table temp(
ch char(5) not null, # 最多5个字符
vc varcha(5) not null # 最多5个字符
);
定长变长
区别差异
char是定长字符串,当存入的字符数量不足指定宽度时,将会使用进行填充。
varchar是变长字符串,当存入的字符数类不足指定宽度时,不会使用任何字符进行填充。
通常情况下来讲,
char的存取速度要比varchar要高(约50%),但是更加浪费磁盘空间。在
InnoDB存储引擎中,不存在这种差异。

#官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
#注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:-(一个中文是一个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满足长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储 检索:
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';) #varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:-(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit **8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit **16最大表示的数字为65535) 检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
差异详解
| Value | CHAR(4) |
Storage Required | VARCHAR(4) |
Storage Required |
|---|---|---|---|---|
'' |
' ' |
4 bytes | '' |
1 byte |
'ab' |
'ab ' |
4 bytes | 'ab' |
3 bytes |
'abcd' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
'abcdefgh' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
|
由于 即存入 |
||||
差异对比
如果要想进定长与变长的差异对比试验,需要用到以下两个函数。
length():查看字节数 char_length():查看字符数
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; # 必须修改模式,使其查看定长字符类型时不会将填充空格移除。
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table ch( # 创建定长字符类型的数据表,最大字符数为5字符
-> name char(5) not null
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table vc( # 创建变长字符类型的数据表,最大字符数为5字符
-> name varchar(5) not null
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into ch(name) values("ab"); # 插入2字符的数据
Query OK, 1 row affected (0.01 sec)
mysql> select char_length(name) from ch; # 可以看到这里的字符数为5,默认填充了3个空白字符
+-------------------+
| char_length(name) |
+-------------------+
| 5 |
+-------------------+
1 row in set (0.00 sec)
mysql> insert into vc(name) values("ab"); # 插入2字符的数据
Query OK, 1 row affected (0.00 sec)
mysql> select char_length(name) from vc; # 字符数量依旧为2字符
+-------------------+
| char_length(name) |
+-------------------+
| 2 |
+-------------------+
1 row in set (0.00 sec)
mysql>
小总结:建议在同一张数据表中统一使用varchar或char类型,这里更推荐使用char类型。
常用函数
大小写转换
upper()小写转大写,lower()大写转小写
mysql> select upper("mysql"),lower("MYSQL");
+----------------+----------------+
| upper("mysql") | lower("MYSQL") |
+----------------+----------------+
| MYSQL | mysql |
+----------------+----------------+
1 row in set (0.00 sec)
mysql>
指定量取
left()与right()函数用于取左或右指定数量的字符
以下将示例取左边3个字符。
mysql> select left("一二三四五",3);
+----------------------+
| left("一二三四五",3) |
+----------------------+
| 一二三 |
+----------------------+
1 row in set (0.00 sec)
mysql>
中间字符
mid()从中间取字符串,参数二为指定起始位置(从1开始),参数三为取的字符数量(可不指定,一直取完)。
以下将演示从第二个字符开始取两个。
mysql> select mid("一二三四五",2,2);
+-----------------------+
| mid("一二三四五",2,2) |
+-----------------------+
| 二三 |
+-----------------------+
1 row in set (0.00 sec)
mysql>
截取子串
substring()从指定起始位置开始取出向右所有字符串,可指定结束位置。(其实我感觉这个和mid()好像没啥区别)
mysql> select substring("一二三四五六七八九",1,4);
+-------------------------------------+
| substring("一二三四五六七八九",1,4) |
+-------------------------------------+
| 一二三四 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql>
字符长度
char_length()可获取字符长度,如果要获取char类型的字符长度且包括填充空白符,需要修改sql模式。
修改sql模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
mysql> select char_length("一二三四五六七八九");
+-----------------------------------+
| char_length("一二三四五六七八九") |
+-----------------------------------+
| 9 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql>
字节长度
length()可获取字节长度。
mysql> select length("一二三四五六七八九");
+------------------------------+
| length("一二三四五六七八九") |
+------------------------------+
| 18 |
+------------------------------+
1 row in set (0.00 sec)
mysql>
字符连接
concat()可将多段字符进行连接。
以下示例将展示一二三四五,---以及12345这三段字符的连接。
mysql> select concat("一二三四五","---","12345");
+------------------------------------+
| concat("一二三四五","---","12345") |
+------------------------------------+
| 一二三四五---12345 |
+------------------------------------+
1 row in set (0.00 sec)
mysql>
MySQL 字符类型的更多相关文章
- mysql字符类型大小写敏感的讨论
mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...
- MySQL字符类型datetime与timestamp
这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...
- mysql string types ---- mysql 字符类型详解
一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...
- mysql字符类型
字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...
- MySQL字符类型学习笔记
目录 一.字符集和字符编码 1.1.字符集 1.2.字符编码 二.字符集排序规则 2.1.排序规则定义 2.2 .排序规则特征 三.CHAR和VARCHAR 3.1.CHAR类型 3.2.VARCHA ...
- Mysql字符类型比较
一. binary和char比较: binary 字节为单位,char字符为单位,字符占几个字节取决于字符集 binary 比较规则基于字节值,char基于字符,即使是_bin的比较规则 范围都0- ...
- MYSQL字符类型数值排序
今天遇到MySQL数字排序问题,我的排序字段是经过计算后的,而计算后的字段直接拿来排序就会按照字符一个个排序,所以这里找到简单的方法, ORDER BY 排序字段* 或者 ORDER BY 排序字段+ ...
- mysql字符类型总结及常用字符函数
常用字符串函数: concat(s1,s2,s3..) 连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...
- mysql数值类型总结及常用函数
最近在学习下,总结一下mysql数值类型: mysql字符类型分: 1.整数类型: 字节 值范围 INTERGER 1 ...
随机推荐
- PHP unserialize() 函数
unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构. PHP 版本要求: PHP 4, PHP 5, PHP 7高佣联盟 w ...
- 7.1 NOI模拟赛 凸包套凸包 floyd 计算几何
计算几何之所以难学 就是因为太抽象了 不够直观 而且情况很多 很繁琐 甚至有一些东西不清不楚.. 这道题注意到题目中的描述 一个鸽子在两个点所连直线上也算. 通过看题解 发现这个地方并非直线而是线段 ...
- 6.29 省选模拟赛 坏题 AC自动机 dp 图论
考场上随手构造了一组数据把自己卡掉了 然后一直都是掉线状态了. 最后发现这个东西不是subtask -1的情况不多 所以就没管无解直接莽 写题有点晚 故没调出来.. 考虑怎么做 容易想到建立AC自动机 ...
- luogu P5826 【模板】子序列自动机 主席树 vector 二分
LINK:子序列自动机 想了一些很有趣的做法. dp 容易看出 f[i][j]表示前i个数匹配了j个数的dp 不过复杂度很高. 贪心 容易想到匹配的时候每个数字尽量往前匹配 这样显然是最优的 复杂度Q ...
- CPU监控 线段树裸题
LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...
- jsp应用-实现用户登陆功能
项目结构 1.login.jsp 这个没什么好说的,把表单提交到校验页面进行校验 2.首先获取request域中user,password,然后进行校验,校验成功把信息存入session域,然后转发到 ...
- 03-注释与API文档
1.注释:Comment分类: 单行注释:// 多行注释:/* */ 文档注释:/** */作用: ① 对所写的程序进行解释说明,增强可读性.方便自己,方便别人 ② 调试所写的代码特点: ①单行注释和 ...
- SSH安全免密码登录:ssh key
ssh key 使用非对称加密方式生成公钥和私钥 私钥存放在本地~/.ssh目录 公钥可以对外公开,放在服务器的~/.ssh/authorized_keys 1.linux平台生成ssh key ss ...
- 恕我直言,你可能真没用过这些 IDEA 插件!
一.前言 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具. 不是我说的喔,百度百科说的... IDEA 如此好用,插 ...
- 高级搜索树-伸展树(Splay Tree)
目录 局部性 双层伸展 查找操作 插入操作 删除操作 性能分析 完整源码 与AVL树一样,伸展树(Splay Tree)也是平衡二叉搜索树的一致,伸展树无需时刻都严格保持整棵树的平衡,也不需要对基本的 ...