MySQL默认字符集设置详情

目录
  • 查看各版本默认字符集
  • 修改MySQL5中的默认字符集
  • 已有库&表字符集的变更
  • 各级别的字符集
  • 字符集与比较规则
    • utf8 与 utf8mb4
    • 比较规则
  • 请求到响应过程中字符集的变化
  • SQL大小写规范
    • Windows和Linux平台区别
  • SQL编写建议
  • sql_mode的合理设置
    • 宽松模式
    • 严格模式

查看各版本默认字符集

在MySQL 8.0版本之前,默认字符集为latin1 ,utf8字符集指向的是utf8mb3 。网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改为utf8mb4 ,从而避免上述乱码的问题。

使用以下命令可以查看MySQL的默认字符集:

show variables like 'character%';
# 或者
show variables like '%char%';

MySQL:8.0.30 中执行:

  • MySQL:5.7.29 中执行

参数解释:

#服务器级别的默认字符集,创建数据库没有显示的指定字符集就使用该级别的默认字符集
character_set_server=latin1
#数据库级别的默认字符集,创建表没有显示的指定字符集就使用该级别的默认字符集
character_set_database=latin1

修改MySQL5中的默认字符集

因为我的MySQL是docker部署,所以修改方式略微有一些不一样

先查看容器ID:

docker ps

根据容器ID进入容器:

docker exec -it e14 /bin/bash

进入 /etc/mysql/mysql.conf.d/ 目录

cd /etc/mysql/mysql.conf.d/
  • 因为docker容器内未安装vim,所以需要先安装vim
#使用国内镜像
​
cp /etc/apt/sources.list /etc/apt/sources.list.bak
​
echo "" > /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian buster main" >> /etc/apt/sources.list ;
echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >> /etc/apt/sources.list ;
echo "deb http://mirrors.aliyun.com/debian buster-updates main" >> /etc/apt/sources.list; 

更新apt-get指令:

apt-get update

安装vim:

 apt-get  install  vim 

在上面的目录下编辑mysqld.cnf:

vim mysqld.cnf

插入如下内容:

character_set_server=utf8
  • 重启容器
  • 再次进入容器查看默认编码

但是原库、原表的设定不会发生变化,参数修改只对新建的数据库生效。

已有库&表字符集的变更

MySQL5.7版本中,以前创建的库,创建的表字符集还是latin1

修改已创建数据库的字符集:

alter database dbtest1 character set 'utf8';

修改已创建数据表的字符集:

alter table t_emp convert to character set 'utf8';

注意:但是原有的数据如果是用非'utf8'编码的话,数据本身编码不会发生改变。已有数据需要导 出或删除,然后重新插入。

各级别的字符集

MySQL有4个级别的字符集和比较规则,分别是:

  • 服务器级别
  • 数据库级别
  • 标级别
  • 列级别

执行如下SQL语句:

show variables like 'character%';

  • character_set_server :服务器级别的字符集
  • character_set_database :当前数据库的字符集
  • character_set_client :服务器解码请求时使用的字符集
  • character_set_connection :服务器处理请求时会把请求字符串从character_set_client 转为character_set_connection
  • character_set_results :服务器向客户端返回数据时使用的字符集

我们介绍的这4个级别字符集和比较规则的联系如下:

  • 如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
  • 如果创建表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
  • 如果创建数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规 则

字符集与比较规则

utf8 与 utf8mb4

utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而字符集表示一个字符所用的最大字节长度,在某些方面会影响系统的存储和性能,所以设计MySQL的设计者偷偷的定义了两个概念:

  • utf8mb3 :阉割过的utf8 字符集,只使用1~3个字节表示字符(表情符号等会乱码)
  • utf8mb4 :正宗的utf8 字符集,使用1~4个字节表示字符

比较规则

MySQL版本一共支持41种字符集,其中的Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如utf8_polish_ci 表示以波兰语的规则比较, utf8_spanish_ci 是以西班牙语的规则比较, utf8_general_ci 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音、大小写。具体如下:

常用操作:

#查看GBK字符集的比较规则
SHOW COLLATION LIKE 'gbk%';
#查看UTF-8字符集的比较规则
SHOW COLLATION LIKE 'utf8%';

#查看服务器的字符集和比较规则
SHOW VARIABLES LIKE '%_server';
#查看数据库的字符集和比较规则
SHOW VARIABLES LIKE '%_database';

#查看具体数据库的字符集
SHOW CREATE DATABASE dbtest1;
#修改具体数据库的字符集
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

#查看表的字符集
show create table employees;
#查看表的比较规则
show table status from atguigudb like 'employees';
#修改表的字符集和比较规则
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

请求到响应过程中字符集的变化

系统变量 描述
character_set_client 服务器解码请求时使用的字符集
character_set_connection 服务器处理请求时会把请求字符串从character_set_client 转为character_set_connection
character_set_results 服务器向客户端返回数据时使用的字符集

这几个系统变量在我的计算机上的默认值如下(不同操作系统的默认值可能不同,MySQL版本:8.0.30):

字符集在请求处理过程中的变化:

SQL大小写规范

Windows和Linux平台区别

在 SQL 中,关键字和函数名是不用区分字母大小写的,比如 SELECT、WHERE、ORDER、GROUP BY 等关键字,以及 ABS、MOD、ROUND、MAX 等函数名。

不过在 SQL 中,你还是要确定大小写的规范,因为在 Linux 和 Windows 环境下,你可能会遇到不同的大小写问题。windows系统默认大小写不敏感,但是linux系统是大小写敏感的。

通过如下命令查看:

SHOW VARIABLES LIKE '%lower_case_table_names%';

Windows系统下:

Linux系统下:

lower_case_table_names 参数值的设置:

  • 默认为0,大小写敏感
  • 设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转换为小写对表和数据库进行查找
  • 设置2,创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

数据库名、表名、表的别名、变量名是严格区分大小写的

关键字、函数名称在 SQL 中不区分大小写

列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的

MySQL在Windows的环境下全部不区分大小写

Linux下大小写规则设置:

当想设置为大小写不敏感时,要在my.cnf 这个配置文件 [mysqld] 中加入lower_case_table_names=1 ,然后重启服务器

  • 但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名
  • 此参数适用于MySQL5.7 ,在MySQL8 下禁止在重新启动 MySQL 服务时将lower_case_table_names 设置成不同于初始化 MySQL 服务时设置的lower_case_table_names 值

SQL编写建议

如果你的变量名命名规范没有统一,就可能产生错误。

这里有一个有关命名规范的建议:

  • 关键字和函数名称全部大写
  • 数据库名、表名、表别名、字段名、字段别名等全部小写
  • SQL 语句必须以分号结尾

数据库名、表名和字段名在 Linux MySQL 环境下是区分大小写的,因此建议你统一这些字段的命名规则,比如全部采用小写的方式

虽然关键字和函数名称在 SQL 中不区分大小写,也就是如果小写的话同样可以执行。但是同时将关键词和函数名称全部大写,以便于区分数据库名、表名、字段名

sql_mode的合理设置

宽松模式

如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受,并且不报错。

举例:我在创建一个表时,该表中有一个字段为name,给name设置的字段类型时char(10) ,如果我在插入数据的时候,其中name这个字段对应的有一条数据的长度超过了10 ,例如'1234567890abc',超过了设定的字段长度10,那么不会报错,并且取前10个字符存上,也就是说你这个数据被存为了'1234567890',而'abc'就没有了。但是,我们给的这条数据是错误的,因为超过了字段长度,但是并没有报错,并且mysql自行处理并接受了,这就是宽松模式的效果。

应用场景:通过设置sql mode为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务sql 进行较大的修改。

严格模式

出现上面宽松模式的错误,应该报错才对,所以MySQL5.7版本就将sql_mode默认值改为了严格模式。所以在生产等环境中,我们必须采用的是严格模式,进而开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。并且我们即便是用的MySQL5.6,也应该自行将其改为严格模式。

开发经验:MySQL等数据库总想把关于数据的所有操作都自己包揽下来,包括数据的校验,其实开发中,我们应该在自己开发的项目程序级别将这些校验给做了,虽然写项目的时候麻烦了一些步骤,但是这样做之后,我们在进行数据库迁移或者在项目的迁移时,就会方便很多。

笔记源于视频教程:MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!

到此这篇关于MySQL默认字符集设置详情的文章就介绍到这了,更多相关MySQL默认字符集 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql 默认字符集设置方法(免安装版)

    以mysql-noinstall-5.0.22-win32为例,解压缩后会看到mysql-5.0.22-win32文件夹下面,有五个ini格式的文件,把my-medium.ini文件拷贝一份,改名为my.ini,打开my.ini文件,在[client].[mysqld]下面加上default-character-set=gb2312,其含义就是把gb2312设置为数据库的默认字符集.设置完毕后需要重新启动myqsl服务. 同理,可以把其他字符集设置成默认字符集.

  • MAC下修改mysql默认字符集为utf8的方法

    1,检查默认安装的mysql的字符集 mysql> show variables like '%char%'; +--------------------------+--------------------------------------------------------+ | Variable_name            | Value                                                  | +---------------------

  • MySQL修改默认字符集编码的方法

    今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了. 查看MySQL字符集的命令是"show variables like '%char%';". 以MySQL5.6为例,默认的字符集为: 在工作中需要将字符集全部修改为utf8. 以下是修改的方法: 1.打开安装目录,默认在"C:\Program Files\MySQL\MySQL Server 5.6", 2.在当前文件夹中复制一份"my-default.

  • MySQL修改默认引擎和字符集详情

    目录 一.数据库引擎 1.1 查看数据库引擎 1.2 修改默认数据库引擎 二.数据库字符集 2.1 查看字符集 2.2 修改字符集 一.数据库引擎 1.1 查看数据库引擎 mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine |

  • 修改mysql默认字符集的两种方法详细解析

    (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,如 default-character-set = utf8    character_set_server = utf8 修改完后,重启mysql的服务,service mysql restart使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8 复制代码 代码如下: +--------------------------+-----------

  • mysql通过my.cnf修改默认字符集为utf-8的方法和注意事项

    选项配置 配置文件路径: /full/path/mysql/bin/my.cnf (默认为/etc/my.cnf ) [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=ut

  • MySQL默认字符集设置详情

    目录 查看各版本默认字符集 修改MySQL5中的默认字符集 已有库&表字符集的变更 各级别的字符集 字符集与比较规则 utf8 与 utf8mb4 比较规则 请求到响应过程中字符集的变化 SQL大小写规范 Windows和Linux平台区别 SQL编写建议 sql_mode的合理设置 宽松模式 严格模式 查看各版本默认字符集 在MySQL 8.0版本之前,默认字符集为latin1 ,utf8字符集指向的是utf8mb3 .网站开发人员在数据库设计的时候往往会将编码修改为utf8字符集.如果遗忘修

  • mysql odbc字符集设置(中文显示乱码)

    1.将mysql安装目录下的my.ini中的[client]项中添加default-character-set=gb2312 [client] default-character-set=gb2312 port=3306 2.将my.ini拷贝到c盘根目录,并修改名字为my.cnf 3.在配置odbc源时,选上Read Options From my.cnf这一项 MySQL ODBC字符集设置 mysql数据库字符集为utf8,使用delphi7的adoquery查询出的结果显示乱码 odbc

  • 深入Mysql字符集设置[精华结合]

    基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding).例如,我们给字符'A'赋予数值0,给字符'B'赋予数值1,则0就是字符'A'的编码: • 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set).例如,给定字符列表为{'A','B'}时,{'A'=>0, 'B'=>1}就是一个字符集: •

  • 深入Mysql字符集设置分析

    基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding).例如,我们给字符'A'赋予数值0,给字符'B'赋予数值1,则0就是字符'A'的编码: • 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set).例如,给定字符列表为{'A','B'}时,{'A'=>0, 'B'=>1}就是一个字符集: •

  • 带你5分钟读懂MySQL字符集设置

    一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的"乱码"问题,很有可能就是因为对字符集与字符序的理解不到位.设置错误造成的. 本文由浅入深,分别介绍了如下内容: 字符集.字符序的基本概念及联系 MySQL支持的字符集.字符序设置级,各设置级别之间的联系 server.database.table.column级字符集.字符序的查看及设置 应该何时设置字符集.字符序 二.字符集.字符序的概念与联系 在

  • MYSQL字符集设置的方法详解(终端的字符集)

    前言 每次利用终端 创建数据库或者创建表的时候,字符集都是latin1,或者进行插入值的时候,显示的是乱码(不指定字符集的时候)如下: 查看当前数据库的字符集 character_set_client:客户端请求数据的字符集 character_set_connection:客户机/服务器连接的字符集 character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集:如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变

随机推荐