有关mysql的坑有哪些

技术有关mysql的坑有哪些这篇文章主要介绍“有关mysql的坑有哪些”,在日常操作中,相信很多人在有关mysql的坑有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有关mysql的坑

本文主要介绍“mysql相关的坑有哪些”。日常操作中,相信很多人对mysql相关的坑都有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“mysql有哪些相关坑”的疑惑!接下来,请和边肖一起学习!

00-1010从事互联网开发的同学对mysql非常熟悉。无论是DBA、开发还是测试,每天都要处理,很多同学可能经历过很多战斗。不过,不知道大家有没有经历过这些坑。

一、前言

之前,我公司在项目开发之初制定开发规范时,专门讨论了mysql的int类型字段定义为有符号还是无符号。

观点一:

对于可以确定存储在其中的值必须是正数的字段,将其定义为UNSIGNED可以节省一半的存储空间。创建无符号字段的语句如下:

create table test _ unsigned(ainunsigned,bintUNSIGNED);观点二:

所有建议都被定义为签名,使用起来相对简单。mysql默认int类型是带符号的。创建签名字段的说明如下:

create table test _ signed(aint);insertintotest _ signed values(-1);执行结果:

有关mysql的坑有哪些

在字段a中插入-1,我们可以看到操作成功。

这两个方案,经过我们的激烈讨论,选择使用int类型字段的符号定义。为什么呢?

create table test _ unsigned(ainunsigned,bintUNSIGNED);insertintotest _ unsignedvalues(1,2);首先,创建test_unsigned表,该表包含两个无符号字段A和B,然后插入一段数据a=1和b=2。

selectb-afromtest _ unsigned;没问题,返回1。

但是如果sql像这样改变:

selecta-bfrom test _ unsigned;执行结果:

有关mysql的坑有哪些

错误的报告。

所以在使用无符号字段时,一定要注意字段减法中负数的坑。建议使用签名字段,以避免不必要的问题。

10月10日到1010年建过表的人都知道,表的主键可以定义为自动递增,这样数据库就可以自己生成主键值,而不用在代码中指定,生成的值是递增的。一般来说,创建表的语句如下:

create table test _ auto _ increment(aint auto _ incrementprimarykey);但是如果你把它改成这样会怎么样呢?

create table test _ auto _ increment(aint auto _ increment);执行结果:

有关mysql的坑有哪些

错误的报告。

不是所有的截图都显示了。完整的提示如下:

1075-不正确的表定义;therapeanyoneautoclumnandit must bedefinedasake,time:0.006000表示自动增长字段,必须定义为key,所以需要添加主键。

此外,还有一个有趣的实验:

insertintotest _ auto _ incre

ment(a) values (null),(50),(null),(8),(null);

大家猜猜执行结果会是什么样的?

有关mysql的坑有哪些

第一个null插入1,然后按真实的数字大小排序后插入,后面两个null,是在最大的数字上面加1。

再看看这条sql主键中插入负数,能执行成功吗?

insert into test_auto_increment values(-3);

答案是可以,主键可以插入负数。

有关mysql的坑有哪些

还有这条sql呢,主键中插入0?

insert into test_auto_increment values(0);

执行结果:

有关mysql的坑有哪些

也可以执行成功,但是没有插入数据

四、字段长度

我们在创建表的时候,给字段定义完类型之后,紧接着需要指定字段的长度,比如:varchar(20),biginit(20)等。那么问题来了,varchar代表的是字节长度,还是字符长度呢?

create table test_varchar(a varchar(20));insert into test_varchar values('苏三说技术');select length(a),CHARACTER_LENGTH(a) from test_varchar;

执行后的结果:

有关mysql的坑有哪些

我们看到中文的5个字length函数统计后长度为15,代表占用了15个字节,而使用charcter_length函数统计长度是5,代表有5个字符。所以varchar代表的是字符长度,因为有些复杂的字符或者中文,一个字节表示不了,utf8编码格式的一个中文汉字占用3个字节。不同的数据库编码格式,占用不同的字节数对照表如下:

有关mysql的坑有哪些

mysql除了varchar和char是代表字符长度之外,其余的类型都是代表字节长度。

int(n) 这个n表示什么意思呢?从一个列子出发:

create table test_bigint (a bigint(4) ZEROFILL);insert into test_bigint values(1);insert into test_bigint values(123456);select * from test_bigint;

ZEROFILL表示长度不够填充0

执行结果:

有关mysql的坑有哪些

mysql常用数字类型字段占用字节数对照表:

有关mysql的坑有哪些

从表中可以看出bigint实际长度是8个字节,但是我们定义的a显示4个字节,所以在不满4个字节时前面填充0。满了4个字节时,按照实际的长度显示,比如:123456。但是,需要注意的是,有些mysql客户端即使满了4个字节,也可能只显示4个字节的内容,比如显示:1234。

所以bigint(4),这里的4表示显示的长度为4个字节,实际长度还是8个字节。

五、忽略大小写

我们知道在英文字母中有大小写问题,比如:a 和 A 是一样的吗?我们认为肯定是不一样的,但是数据库是如何处理的呢?

create table test_a(a varchar(20));insert into test_a values('a');insert into test_a values('A');select * from test_a where a = 'a';

执行结果是什么呢?

有关mysql的坑有哪些

本以为只会返回a,但是实际上把A也返回了,这是为什么呢?

有关mysql的坑有哪些

该表默认的Collation是utf8_general_ci,这种Collation会忽略大小写,所以才会出现查询小写字母a的值,意外把大写字母A的值也查询出来了。

那么如果我们只想查询出小写a的值该怎么办?先看看mysql支持哪些Collation?

show collation;

有关mysql的坑有哪些

从上图中我们可以找到utf8_bin,这个表示二进制格式的数据,我们设置成种类型的试试。

有关mysql的坑有哪些

修改一下字段类型

ALTER TABLE test_a MODIFY COLUMN a VARCHAR(20) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

再查看一下数据

select * from test_a where a = 'a';

执行结果:

有关mysql的坑有哪些

果然,结果对了。

六、特殊字符

笔者之前做项目的时候,提供过一个留言的功能,结果客户端用户输入了一个emoji表情,直接导致接口报错了。

有关mysql的坑有哪些

最后定位原因是由于当时数据库和表的字符编码都是用的utf8,mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。

该如何解决这个问题呢?

将字符编码改成utf8mb4,utf8mb4最多能有4字节,不过,在mysql5.5.3或更高的版本才支持。

在mysql 的配置文件 my.cnf 或 my.ini 配置文件中修改如下:

[client]default-character-set = utf8mb4[mysqld]character-set-server = utf8mb4collation-server     = utf8mb4_general_ci

重启MySQL,然后使用以下命令查看编码,应该全部为utf8mb4,这是修改整个数据库的编码方式。

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';ji

结果为:

有关mysql的坑有哪些

也可以单独修改某张表的编码方式:

alter table test_a convert to character set utf8mb4 collate utf8mb4_bin;

以及修改某个字段的编码方式:

ALTER TABLE test_a CHANGE a a VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

此外,建议同学们在创建数据库和表的时候字符编码都定义成utf8mb4,避免一些不必要的问题。

到此,关于“有关mysql的坑有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/39937.html

(0)

相关推荐

  • Idea下仓库初始化与文件提交涉及到的基本命令有哪些

    技术Idea下仓库初始化与文件提交涉及到的基本命令有哪些小编给大家分享一下Idea下仓库初始化与文件提交涉及到的基本命令有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、Idea下仓库初始化与文件

    攻略 2021年12月9日
  • 如何用python实现简单的文本情感分析

    技术如何用python实现简单的文本情感分析如何用python实现简单的文本情感分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。很久没在公

    攻略 2021年11月15日
  • 毅字五笔怎么打,毅日语怎么读,用拼音注音

    技术毅字五笔怎么打,毅日语怎么读,用拼音注音毅字读音:yì毅拼音:yì,注音:一ˋ,部首:殳部,部外笔画:11画,总笔画:15画五笔86:UEMC,五笔98:UEWC,仓颉:YOHNE,郑码:SUGQ四角:07247,结

    生活 2021年10月22日
  • 三戒是哪三戒,柳宗元的\”三戒\”是什么?

    技术三戒是哪三戒,柳宗元的\三戒\是什么?柳宗元的《三戒》包括《临江之麋》三戒是哪三戒、《永某氏之鼠》和 《黔之驴》 这一组三篇寓言,是作者贬谪永州时所写。题名“三戒”,可能是取《论语》“君子有三戒”之意。文前的小序,已

    生活 2021年10月22日
  • C++11容器的insert怎么使用

    技术C++11容器的insert怎么使用本篇内容介绍了“C++11容器的insert怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

    攻略 2021年11月29日
  • 一千瓦时等于多少焦耳,瓦和焦耳是什么换算关系

    技术一千瓦时等于多少焦耳,瓦和焦耳是什么换算关系1W=1J/s 1瓦=1焦耳/秒 我再补充一下:这里面,瓦是功率单位,既然是“功率”,有一个“率”字,就可以知道,是单位时间上的意义了一千瓦时等于多少焦耳。比如,速率:m

    生活 2021年10月24日