mysql字符集、隔离等级

一、字符集

一、utf8mb4和UTF-8

1、主要区别

字符范围

  • utf8:是 MySQL 早期实现的 UTF-8 编码,支持 3 个字节的字符编码,这意味着它不能表示 UTF-8 的完整字符集,例如某些罕见的汉字和一些 emoji 表情。
  • utf8mb4:是 MySQL 完整实现的 UTF-8 编码,最多支持 4 个字节的字符编码,可以完全表示 Unicode 字符集,包括所有的 emoji。

存储和索引

  • utf8:每个字符最多占用 3 个字节。
  • utf8mb4:每个字符最多占用 4 个字节。

2、utf8mb4 引起的报错:Row size too large

由于 utf8mb4 字符集使用 4 个字节来存储字符,因此相较于 utf8,会显著增加列的字节数。这可能会导致行大小超出 MySQL 表的限制。

MySQL 表的行大小限制为 65535 字节,这个限制包括了 MySQL 用于存储元数据的额外开销。因此,当你将字符集从 utf8 改为 utf8mb4 时,如果有多列的文本数据,其字节数总和可能超过这个限制,从而导致类似的报错。

3、VARCHAR(2048)
  • 类型VARCHAR 表示可变长度字符串。
  • 长度2048 表示最多可以存储 2048 个字符。
  • 注意,2048 指的是字符数,而不是字节数。每个字符所占用的实际字节数取决于所使用的字符集。
  • 例如: 在 utf8mb4 字符集中,每个字符最多占用 4 个字节,因此 VARCHAR(2048) 在最坏情况下可能占用最多 2048 * 4 = 8192 个字节的存储空间。
  • 存储机制:MySQL 在储存 VARCHAR 类型时,只存储实际字符的长度,并在前面加上一个或两个字节来表示字符串的长度,因此这是空间高效的。

4、在 MySQL 中,每个字符集都有一个默认的排序规则(也称为排序序列或校对规则)。

对于 utf8 字符集,默认的排序规则是 utf8_general_ci

具体解释

  • **utf8**:这是 MySQL 中的一种字符集,用于存储 UTF-8 编码的字符。

  • **utf8_general_ci**:

    • **utf8**:指定字符集。
    • **general**:指定排序规则的类型。它是一种通用的排序规则,适用于大多数语言的排序需求。
    • **ci**:指大小写不敏感(case-insensitive),这意味着在使用这个排序规则时,'A' 和 'a' 被认为是相同的。

二、查看字符集

1.查看MYSQL数据库服务器和数据库字符集

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)

2.查看MYSQL所支持的字符集

mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)

3.查看库、表的字符集

语法:show create database  库\G;

mysql> show create database confluence\G
*************************** 1. row ***************************
       Database: confluence
Create Database: CREATE DATABASE `confluence` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */
1 row in set (0.00 sec)

语法:show database status from 库名 like  表名;

mysql> mysql> show table status from   confluence  like 'user_mapping'  ;
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name         | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| user_mapping | InnoDB |      10 | Dynamic    |    0 |              0 |       16384 |               0 |        16384 |         0 |           NULL | 2020-10-16 03:30:39 | NULL        | NULL       | utf8_bin  |     NULL |                |         |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)

4.查看表中所有列的字符集

语法:show full columns from 表名;

mysql> show full columns from SECRETS ;
+-------+--------------+-----------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type         | Collation | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+--------------+-----------+------+-----+---------+-------+---------------------------------+---------+
| key   | varchar(255) | utf8_bin  | NO   | PRI | NULL    |       | select,insert,update,references |         |
| value | text         | utf8_bin  | NO   |     | NULL    |       | select,insert,update,references |         |
+-------+--------------+-----------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)

三、设置字符集(3种方法)

1.创建时指定字符集

创建库的时候指定字符集:

语法:create database 库名 default character set=字符集;

mysql> create database db2 default character set=utf8;
Query OK, 1 row affected (0.00 sec)

创建表的时候指定字符集:

语法:create table 表名(属性)default character set = 字符集;

create table test1(id int(6),name char(10)) default character set = 'gbk';
Query OK, 0 rows affected (0.13 sec)

sql 文本

CREATE DATABASE IF NOT EXISTS `per` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';

USE `persistence`;

CREATE TABLE IF NOT EXISTS `cfg` (
  `ID` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '物理主键',
  `KEY` VARCHAR(128) NOT NULL COMMENT '配置项名称',
  `VALUE` VARCHAR(255) NOT NULL COMMENT '配置项值',
  `DESCRIPTION` VARCHAR(255) NOT NULL COMMENT '配置项描述',
  `CREATE_TIME` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `UPDATE_TIME` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `CREATE_USER` VARCHAR(32) DEFAULT NULL COMMENT '创建用户',
  `UPDATE_USER` VARCHAR(32) DEFAULT NULL COMMENT '更新用户',
  PRIMARY KEY (`ID`),
  UNIQUE INDEX `uk_KEY`(`KEY`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = '业务参数配置';

2.创建后指定字符集

修改全局字符集

/*建立连接使用的编码*/
set character_set_connection=utf8;
/*数据库的编码*/
set character_set_database=utf8;
/*结果集的编码*/
set character_set_results=utf8;
/*数据库服务器的编码*/
set character_set_server=utf8;

set character_set_system=utf8;

set collation_connection=utf8;

set collation_database=utf8;

set collation_server=utf8;

修改库的字符集

语法:alter database 库名 default character set 字符集;

mysql> alter database confluence default character set gbk;
Query OK, 1 row affected (0.01 sec)

修改表的字符集

语法:alter table 表名 convert to character set 字符集;

alter table test1 convert to character set utf8;

修改字段的字符集

语法:alter table 表名 modify 字段名 字段属性 character set gbk;

 alter table test1 modify name char(10) character set gbk;

3.my.ncf配置文件中修改

character-set-server = utf8
#定义服务端所使用的字符集为UTF8

#定义client与server之间传递字符的编码规则为utf8
init_connect = SET NAMES utf8

二、隔离级别

一、四种隔离等级从低到高依次

 

1、Read Uncommitted(读未提交)

 

  最低的隔离级别,可能会读取到其他会话中未提交的数据。

  存在脏读、不可重复读和幻读的问题。

 

2、Read Committed(读已提交) 默认隔离级别。

 

  只能读取到已经提交的数据,避免了脏读的问题。

  但是可能会发生不可重复读和幻读的情况。

 

3、Repeatable Read(可重复读)

 

  对于同一个事务中多次读取同一条记录,查询结果是一致的,避免了不可重复读的问题。

  但是可能会发生幻读的情况。

 

4、Serializable(可串行化)

 

  最高的隔离级别,可以避免脏读、不可重复读以及幻读的问题。

  但是会对并发性能产生很大影响,吞吐量较低。

不同的隔离级别对并发性能的影响是不同的,隔离级别越高,并发性能就越低。

在实际应用中,需要权衡隔离级别和性能需求,通常情况下可以使用 Read Committed 或 Repeatable Read 级别。如果对数据一致性要求较高,可以选择 Serializable 级别,但会牺牲并发性能。

二、设置

1、查看

SELECT @@tx_isolation;

2、命令行

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

3、配置文件

[mysqld]
transaction-isolation = REPEATABLE-READ

 

posted @ 2020-10-16 13:37  凡人半睁眼  阅读(158)  评论(0编辑  收藏  举报