【MySQL】数据类型之字符相关
"
目录
字符类型
官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
注意:char与varchar括号内的参数指的是字符的固定长度
char类型
定长,简单粗暴,浪费空间,存取速度快
- 字符长度:0 ~ 255(一个中文是一个字符,是utf8编码的3个字节)
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储. - 检索:在检索时,显示的结果会自动删除尾部的空格,除非打开pad_char_to_full_length SQL模式
(设置SQL模式:set sql_mode = 'pad_char_to_full_length'; 查询sql的默认模式:select @@sql_mode;)
varchar类型
变长,精确,节省空间,存取速度慢
- 字符长度:0 ~ 65535(如果大于21845会提示用其它类型,MySQL行最大限制为65535字节,字符编码为utf8:官方文档)
- 存储:varchar类型存储数据的真实内容,不会用空格填充,也不会在查询时过滤尾部的空格.
强调:varchar类型会在真实数据前加1-2bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2bytes最大表示65535长度,正好符合MySQL对row的最大字节限制,即已足够使用).
[如果真实数据<255bytes,则需要1bytes的前缀(1bytes=8bit 2**8最大表示的数字为255);如果真实数据>255bytes,则需要2bytes的前缀(2bytes=16bit 2**16最大表示的数字为65535)] - 检索:尾部有空格会保存下来,在检索时也会正常显示包含空格在内的内容.
char 与 varchar 的官方解释:
实测
测试之前先来了解两个函数:
- length() # 查看字节数
- char_length() # 查看字节数
-
# 创建测试表,分别指明字段x为char类型,字段y为varchar类型
-
mysql> create table test(x char(5), y varchar(5));
-
Query OK, 0 rows affected (0.11 sec)
-
-
# 插入数据,后面加空格
-
mysql> insert into test values("数据库 ", "数据库 ");
-
Query OK, 1 row affected (0.00 sec)
-
-
# 在检索时,char类型会过滤掉后面的空格,而varchar正常显示
-
mysql> select x, char_length(x), y, char_length(y) from test;
-
+-----------+----------------+------------+----------------+
-
| x | char_length(x) | y | char_length(y) |
-
+-----------+----------------+------------+----------------+
-
| 数据库 | 3 | 数据库 | 4 |
-
+-----------+----------------+------------+----------------+
-
1 row in set (0.00 sec)
-
-
# 设置SQL模式,使char类型原形毕露
-
mysql> set sql_mode = 'pad_char_to_full_length';
-
Query OK, 0 rows affected, 1 warning (0.00 sec)
-
-
# 查当前SQL模式
-
mysql> select @@sql_mode;
-
+-------------------------+
-
| @@sql_mode |
-
+-------------------------+
-
| PAD_CHAR_TO_FULL_LENGTH |
-
+-------------------------+
-
1 row in set (0.00 sec)
-
-
# 再次检索,发现char类型的数据是占满规定的长度的(在后面填充空格)
-
mysql> select x, char_length(x), y, char_length(y) from test;
-
+-------------+----------------+------------+----------------+
-
| x | char_length(x) | y | char_length(y) |
-
+-------------+----------------+------------+----------------+
-
| 数据库 | 5 | 数据库 | 4 |
-
+-------------+----------------+------------+----------------+
-
1 row in set (0.00 sec)
-
-
# 查看字节数
-
# char类型:3个中文字符 + 两个空格 = 11bytes
-
# varchar类型:3个中文字符 + 1个空格 = 10bytes
-
mysql> select x, length(x), y, length(y) from test;
-
+-------------+-----------+------------+-----------+
-
| x | length(x) | y | length(y) |
-
+-------------+-----------+------------+-----------+
-
| 数据库 | 11 | 数据库 | 10 |
-
+-------------+-----------+------------+-----------+
-
1 row in set (0.01 sec)
总结
常用字符串系列:char 与 varchar
虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
其它字符串系列(效率:char > varchar > text):
- TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
- BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
- BINARY系列 BINARY VARBINARY
TEXT系列:text数据类型用于保存变长的大字符串,可以最多到65535(2**16 - 1)个字符
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
枚举类型与集合类型
即字段的值只能在规定范围中选择,如单选框,多选框
enum枚举:即单选,只能在给定的范围内选一个值.(如:性别 sex boy/girl)
set集合:即多选,在给定的范围内可以选择一个或一个以上的值.(如:爱好1,爱好2,爱好3)
-
mysql> create table information(
-
-> name char(3),
-
-> sex enum("男", "女"),
-
-> hobby set("抽烟", "喝酒", "烫头")
-
-> );
-
Query OK, 0 rows affected (0.05 sec)
-
-
mysql> insert into information values
-
-> ("张三", "男", "抽烟,喝酒"),
-
-> ("李四", "女", "烫头");
-
Query OK, 2 rows affected (0.00 sec)
-
Records: 2 Duplicates: 0 Warnings: 0
-
-
mysql> select * from information;
-
+---------+------+---------------+
-
| name | sex | hobby |
-
+---------+------+---------------+
-
| 张三 | 男 | 抽烟,喝酒 |
-
| 李四 | 女 | 烫头 |
-
+---------+------+---------------+
-
2 rows in set (0.00 sec)
"
【MySQL】数据类型之字符相关的更多相关文章
- mysql 数据类型
1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) ...
- MySQL 数据类型 详解
MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...
- MySQL数据类型的验证
CHAR char (M) M字符,长度是M*字符编码长度,M最大255. 验证如下: mysql)) default charset=utf8; ERROR (): ); use BLOB or T ...
- MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题
MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...
- 浅谈MySQL数据类型
MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 一.数值类型 MySQL支持所有标 ...
- MySQL数据类型——数值类型
1.1.1 整型 整型 占用字节 范围 范围 tinyint 1 -27~27-1 -128~127 smallint 2 -215~215-1 -32768~32767 mediumint 3 -2 ...
- 【转】MySQL数据类型和常用字段属性总结
来源:http://www.jb51.net/article/55853.htm 这里先总结数据类型.MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. ...
- Oracle、SQL Server、MySQL数据类型对比
1,标准SQL数据类型 BINARY 每个字符占一个字节 任何类型的数据都可存储在这种类型的字段中.不需数据转换(例如,转换到文本数据).数据输入二进制字段的方式决定了它的输出方式. BIT 1 个字 ...
- MySQL数据类型和常用字段属性总结
前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键.MySQL提供了一组可以赋给表中各个 ...
- MySql数据类型详解
可配合http://www.cnblogs.com/langtianya/archive/2013/03/10/2952442.html学习 MySql数据类型 1.整型(xxxint) MySQ ...
随机推荐
- JAVA 注解教程(三)注解的属性
简介 注解的属性也叫做成员变量,注解只有成员变量,没有方法.注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型 实例 @Targe ...
- C# MVC扩展方法
控制方法 : 在不修改类原来代码的情况下,给类扩展方法 https://www.cnblogs.com/jxsimon/articles/5043654.html https://www.cnblog ...
- 如何做好 Android 端音视频测试?
在用户眼中,优秀的音视频产品应该具有清晰.低延时.流畅.秒开.抗丢包.高音效等特征.为了满足用户以上要求,网易云信的工程师通过自建源站,在SDK端为了适应网络优化进行QoS优化,对视频编码器进行优化, ...
- python 日志模块 日志格式
形如: formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%b%d-%H: ...
- java_获取指定ip的定位
因为自己网站后台做了一个进站ip统计,之前只是获取了ip,这次优化了下,把ip的大致区域弄出来了 废话不多说,进正题 首先要用到几个网络大头的api 淘宝API:http://ip.taobao.co ...
- 并发之ATOMIC原子操作--CAS乐观锁原理(二)
1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...
- Nearest Interesting Number
Polycarp knows that if the sum of the digits of a number is divisible by 33, then the number itself ...
- 浅谈DAO工厂设计模式(工厂模式的好处)
随着软件分层设计的流行及广泛的应用,对于DAO的设计模式大家已经不再陌生了,DAO层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的VO进行分离.前段时间也针对于DAO的设计介绍过一个 ...
- springmvc、 springboot 项目全局异常处理
异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...
- 【网易官方】极客战记(codecombat)攻略-地牢-祸之火焰
关卡连接: https://codecombat.163.com/play/level/banefire 绕着火焰跳舞,否则你的骨头下次就会被烧着 默认代码 # 食人魔看上去又大又慢,这是你的机会. ...