Skip to main content

字符集

mysql 的字符集该用哪个


MySQL 支持多种字符集,这是因为不同的语言和文化有不同的字符需求。你可以根据你的具体需求选择适合的字符集,以下是一些常见的字符集及其用途:

  1. UTF-8:这是最常用的字符集,支持多种语言和字符,包括汉字、拉丁字母、阿拉伯字母等等。如果你需要支持多种语言或者不确定需要支持哪种语言,建议使用 UTF-8 字符集。
  2. GBK:这是用于中文的字符集,支持繁体中文和简体中文,但不支持其他语言的字符。
  3. Latin1:也称为 ISO-8859-1,这是最早的字符集之一,主要支持欧洲语言,如英语、法语、德语、西班牙语等等。
  4. ASCII:这是美国信息交换标准代码,只支持英语字符。
  5. Unicode:这是一种统一的字符集,支持世界上所有语言的字符,但是它的存储空间比其他字符集要大。

如果你只需要支持一种语言,可以选择对应的字符集,例如 GBK 用于中文,Latin1 用于欧洲语言。如果需要支持多种语言,建议使用 UTF-8 字符集。


utf8mb4 下面还有很多类型,比如 utf8mb4_bin 和 utf8mb4_estonian_ci 这些是什么?


在 MySQL 的 utf8mb4 字符集下,还有不同的字符集排序规则(Collation),每个排序规则适用于不同的语言和文化,以确保正确地对字符进行排序、比较和搜索。以下是一些常见的 utf8mb4 字符集排序规则及其简单解释:

  1. utf8mb4_bin:这是一个二进制排序规则,它比较字符串中每个字符的二进制值。这种排序规则对大小写敏感,区分不同的字符编码,例如'A'和'a'被视为不同的字符。这种排序规则适用于需要对字符进行精确比较的场景,例如密码比对等。
  2. utf8mb4_general_ci:这是一个通用排序规则,它对大小写不敏感,忽略重音符号,例如'é'和'e'被视为相同的字符。这种排序规则适用于大多数情况,例如搜索、排序等。
  3. utf8mb4_unicode_ci:这是一个基于 Unicode 标准的排序规则,它对大小写不敏感,忽略重音符号,同时支持多种语言和字符。这种排序规则适用于需要支持多种语言和字符的场景,例如国际化应用。
  4. utf8mb4_estonian_ci:这是一个专门为爱沙尼亚语设计的排序规则,它对大小写不敏感,忽略重音符号,并将'õ'和'ö'视为不同的字符。这种排序规则适用于只需要支持爱沙尼亚语的应用。

总的来说,选择适合自己应用的字符集和排序规则是很重要的,它将直接影响到应用的功能和性能。


utf8mb4 中的 mb4


在 MySQL 中,UTF-8 编码最多可以支持 3 个字节表示的字符,但是有些字符需要 4 个字节表示,例如一些表情符号。为了支持这些字符,MySQL 引入了一个新的字符集:utf8mb4。其中,mb4 代表的是"most bytes 4",表示这个字符集最多可以使用 4 个字节表示一个字符。

在实际应用中,如果需要支持包括表情符号在内的各种字符,建议使用 utf8mb4 字符集,以避免出现乱码等问题。如果使用的是旧的 utf8 字符集,可能会出现字符无法正确存储或者显示的情况。


在M ysql 中 如何设置默认的字符集为 utf8mb4_unicode_ci


你可以通过以下步骤在 MySQL 中设置默认字符集为 utf8mb4_unicode_ci:

  1. 打开 MySQL 客户端,并使用管理员账号登录 MySQL 服务器。
  2. 创建一个新的数据库或者选择一个已有的数据库,用于测试默认字符集的设置。
  3. 进入该数据库,并执行以下 SQL 命令:

sql

ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  

其中,database_name是你要设置默认字符集的数据库名称,utf8mb4是字符集名称,utf8mb4_unicode_ci是排序规则名称。

  1. 确认默认字符集的设置是否生效。你可以通过以下 SQL 命令查看当前数据库的字符集和排序规则:

sql

SHOW CREATE DATABASE database_name;  

在结果中,你应该能看到以下类似的输出:

sql

CREATE DATABASE `database_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */  

如果结果中包含了DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,那么说明默认字符集的设置已经生效。

请注意,在设置默认字符集时,需要确保所有表和列的字符集也与默认字符集一致,以避免出现数据存储或显示问题。如果需要修改表或列的字符集,可以使用类似的ALTER TABLEALTER COLUMN命令。


utf8mb4_unicode_ci 和 utf8mb4_unicode_520_ci


utf8mb4_unicode_ciutf8mb4_unicode_520_ci都是 MySQL 数据库中的排序规则,都基于 Unicode 字符集进行排序,但两者之间有一些区别。

utf8mb4_unicode_ci是 MySQL 5.5.3 及以上版本中默认的排序规则。它支持 Unicode 字符集的所有字符,并按照 Unicode 标准进行排序,同时也支持大小写不敏感的比较。这意味着如果在使用utf8mb4_unicode_ci排序规则时,如果查询包含中文、日文、韩文等非拉丁字符时,能够正确地排序。

utf8mb4_unicode_520_ci是 MySQL 8.0.0 及以上版本引入的一种新的排序规则,它也支持 Unicode 字符集的所有字符,并按照 Unicode 标准进行排序,但是它比utf8mb4_unicode_ci更加严格,更符合 Unicode 5.20 标准。例如,在utf8mb4_unicode_ci中,一些字符会被认为是相等的,而在utf8mb4_unicode_520_ci中,这些字符会被视为不相等。因此,如果需要更加准确地进行排序和比较,可以考虑使用utf8mb4_unicode_520_ci

需要注意的是,在 MySQL 8.0.0 及以上版本中,utf8mb4_unicode_520_ci已经取代了utf8mb4_unicode_ci成为默认的排序规则。如果需要在较早的版本中使用utf8mb4_unicode_520_ci排序规则,需要手动进行设置。


基础

MySQL 有以下常见的字段类型:

数字类型:

INT: 整数,取值范围为 -2147483648 到 2147483647。
BIGINT: 大整数,取值范围为 -9223372036854775808 到 9223372036854775807。
SMALLINT: 小整数,取值范围为 -32768 到 32767。
TINYINT: 微小整数,取值范围为 -128 到 127。
DECIMAL: 十进制数,精确小数。
FLOAT: 单精度浮点数。
DOUBLE: 双精度浮点数。
字符串类型:

CHAR: 定长字符串,固定长度为 0 到 255 个字符。
VARCHAR: 变长字符串,长度为 0 到 65,535 个字符。
TEXT: 可存储大量文本,长度为 0 到 2^32 - 1 个字符。
BLOB: 二进制大对象,长度为 0 到 2^32 - 1 个字符。
日期和时间类型:

DATE: 日期,格式为 YYYY-MM-DD。
TIME: 时间,格式为 HH:MM:SS。
DATETIME: 日期和时间,格式为 YYYY-MM-DD HH:MM:SS。
YEAR: 年份,格式为 YYYY。
TIMESTAMP: 时间戳,格式为 YYYY-MM-DD HH:MM:SS。
其他类型:

ENUM: 枚举类型,可以存储固定的字符串列表。
SET: 集合类型,可以存储多个

如果是主键 使用int还是bigint

一般来说,如果是主键,使用 bigint 更好。

因为 int 的取值范围是 -2147483648 到 2147483647,而 bigint 的取值范围是 -9223372036854775808 到 9223372036854775807,这意味着 bigint 可以存储更大的整数,并且不会出现数据溢出的问题。

此外,如果你预计你的数据表中可能会存在大量数据,使用 bigint 作为主键可以确保主键值永远不会溢出。

因此,如果是主键,建议使用 bigint。

datetime和timestamp区别

Datetime 和 Timestamp 在 MySQL 中都是用来存储日期和时间的数据类型,但是它们有一些重要的区别:

存储范围:Datetime 的取值范围是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59',而 Timestamp 的取值范围是 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

精度:Datetime 精确到秒,而 Timestamp 精确到微秒。

数据自动更新:如果将一个 Timestamp 列定义为自动更新,则每次对该列的更新操作都会更新其值,因此它可以用来记录数据的更新时间。而 Datetime 列并不会自动更新。

因此,如果你需要记录一个具体的日期和时间,建议使用 Datetime;如果需要记录时间戳(即数据的更新时间),建议使用 Timestamp。

char 和 varchar的区别

Char 和 Varchar 是 MySQL 中用来存储字符串数据类型的两种数据类型。下面是它们的主要区别:

存储空间:Char 是定长字符串数据类型,即不管实际存储的字符串长度多少,都会占用固定的空间;Varchar 是变长字符串数据类型,即实际占用的空间与存储的字符串长度成正比。

性能:Varchar 的存储效率更高,因为它只会占用实际需要的空间;Char 的存储效率较低,因为它占用的空间可能远大于实际需要的空间。

排序和比较:由于 Char 是定长字符串数据类型,在排序和比较字符串时速度更快;而 Varchar 由于是变长字符串数据类型,在排序和比较字符串时速度较慢。

因此,如果你需要存储固定长度的字符串数据,建议使用 Char;如果需要存储可变长度的字符串数据,建议使用 Varchar。

datetime(3) 的含义

DATETIME(3) 表示的是 MySQL 中的一种 DATETIME 数据类型,其中的 (3) 代表的是精度,即该数据类型能够精确到毫秒级别。因此,使用 DATETIME(3) 可以在存储日期和时间时同时精确到毫秒级别。

MySQL 中主键自增策略

MySQL 中主键自增策略有以下几种:

AUTO_INCREMENT:MySQL 支持在创建表时定义某一列为自增主键,在插入新数据时,该列会自动增加,不需要人工干预。
UUID:UUID 是 Universally Unique Identifier 的缩写,可以用来生成唯一的标识符。MySQL 也支持使用 UUID 作为主键,以保证数据的唯一性。
自定义自增:如果不使用 AUTO_INCREMENT,也可以通过使用存储过程或触发器来自定义自增策略。
以上是 MySQL 中常见的主键自增策略,选择那种策略要根据实际需求进行决策。

如果你想使用 UUID 作为主键,可以通过以下步骤定义表:

创建一个 CHAR(36) 类型的字段用于存储 UUID:

 CREATE TABLE table_name (    id CHAR(36) NOT NULL,    ...    PRIMARY KEY (id));  

在插入数据时使用 UUID() 函数生成 UUID 并保存到该字段中:

INSERT INTO table_name (id, ...) VALUES (UUID(), ...);  

请注意,在不同的 MySQL 版本中,UUID() 函数的用法可能略有差别,请确保使用正确的版本。

一般来说,使用 CHAR(36) 存储 UUID 是因为 UUID 通常是 36 个字符长,包含 8 个 - 分隔符,所以需要 36 个字符的存储空间。例如,一个标准的 UUID 的格式可能是:a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6。

使用 CHAR(36) 存储 UUID 可以方便地保证 UUID 在存储和使用过程中的唯一性,同时可以避免在比较 UUID 时出现类型不匹配的问题。如果使用其他类型存储 UUID,可能会出现精度丢失等问题。

UID相比自增有什么特点和优势吗?如果自增策略溢出会怎么样?UUID有溢出的可能吗?

UUID 与自增主键相比具有以下特点和优势:

全球唯一性:UUID 是基于全球唯一的算法生成的,因此可以保证全球范围内的唯一性。

分布式数据库:UUID 适用于分布式数据库环境,因为它可以避免因为同步数据库导致的主键冲突。

生成速度:UUID 可以在客户端或应用程序生成,因此不需要与数据库进行通信,生成速度快。

编码长度:UUID 编码长度是固定的,并且不存在溢出的情况。

自增主键如果溢出,将导致数据库出现错误,数据库将无法继续运行。此外,由于自增主键的生成需要与数据库通信,因此生成速度较慢。

UUID 不存在溢出的可能,因为它是通过算法生成的,不受数据库限制。