工作中涉及到的问题
character_set 变量说明
1 | show variables like 'character%'; |
+————————————–+————————————————————————————+
| Variable_name | Value |
+————————————–+————————————————————————————+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | D:\DevelopTools\mysql-8.0.26-winx64\share\charsets\ |
+————————–+————————————————————————————————+
8 rows in set (0.03 sec)
character_set_client: 设置客户端使用的字符集。
character_set_connection: 设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
character_set_database: 设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。
character_set_filesystem: 文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。
character_set_results: 数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
character_set_server: 服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。
character_set_system: 数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。
character_sets_dir: 这个变量是字符集安装的目录。
在启动mysql后,只关注下列变量是否符合我们的要求
- character_set_client
- character_set_connection
- character_set_database
- character_set_results
- character_set_server
下列三个系统变量不需要关心,不会影响乱码等问题
- character_set_filesystem
- character_set_system
- character_sets_dir
修改字符集
- 使用 set 方式,比如要修改 character_set_client 的值,使用命令 set character_set_client=xxx,这个只是临时的
- 修改 my.ini 文件
关闭/开启服务
window 环境下
1 | net stop mysql # 关闭 MySQL 服务 |
注意事项:
- 服务名称为创建服务时设定的名称,比如我设置 MySQL 8.x 版本的服务为 mysql8,那将上面 mysql 替换为 mysql8
- cmd 窗口需要使用管理员身份运行
utf8 和 utf8mb4
MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes 4 的意思,专门用来兼容四字节的 unicode。
utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4 外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了。
可以简单的理解 utf8mb4 是目前最大的一个字符编码,支持任意文字。
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。
utf8mb4 比 utf8 多了 emoji 编码支持.
排序规则
utf8_unicode_ci比较准确,utf8_general_ci速度比较快。
通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了
如果是utf8mb4那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci
数据库建模
概念模型
在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结,提炼出来的用以描述用户业务需求的一些概念的东西。
如销售业务中的“客户”和“定单”,还有就是“商品”,“业务员”。主要是抽取出系统中有哪些概念(此时可以不包含属性,只有实体集,联系集的分析结构)
表示概念模型最常用的是**”实体-关系”图**。 E-R图主要是由实体、属性和关系三个要素构成的。
简单概括,就是——“是什么”
逻辑模型
逻辑模型就是要将概念模型具体化,就是要实现概念模型所描述的东西,需要哪些具体的功能,处理哪些具体的信息,是对概念模型的进一步细化。
:“客户”信息基本上要包括:单位名称,联系人,联系电话,地址等属性;“商品”信息基本上要包括:名称,类型,规格,单价等属性;“定单”信息基本上要包括:日期和时间属性。并且“定单”要与“客户”,“业务员”和“商品”明细关联。
系统需要建立几个数据表:业务员信息表,客户信息表,商品信息表,定单表。
系统要包括几个功能:业务员信息维护,客户信息维护,商品信息维护,建立销售定单 。
简单概括,就是——“做什么”
物理模型
物理模型是对真实数据库的描述。如关系数据库中的一些对象为表、视图、字段、数据类型、长度、主键、外键、索引、约束、是否可为空、默认值。
在具体的物理介质上实现出来。如:数据库使用SQL Server 2000,这样就可以编写具体的SQL脚本在数据库服务器上将数据库建立起来。其中包括业务员信息表,客户信息表,商品信息表,定单表。
简单概括,就是——“怎么做”
DECIMAL 数据类型
MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。
要定义数据类型为DECIMAL的列,请使用以下语法:
1 | column_name DECIMAL(P,D); |
在上面的语法中:
P是表示有效数字数的精度。P范围为1〜65。D是表示小数点后的位数。D的范围是0~`30。MySQL要求D小于或等于(<=)P`。
DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。
如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。
以下示例使用DECIMAL数据类型定义的一个叫作amount的列。
1 | amount DECIMAL(6,2); |
在此示例中,amount列最多可以存储6位数字,小数位数为2位; 因此,amount列的范围是从-9999.99到9999.99。
MySQL允许使用以下语法:
1 | column_name DECIMAL(P); |
这相当于:
1 | column_name DECIMAL(P,0); |
在这种情况下,列不包含小数部分或小数点。
此外,我们甚至可以使用以下语法。
1 | column_name DECIMAL; |
在这种情况下,P的默认值为10。