MySQL 相关 

Last Update: 2024-06-03

目录

安装相关

Windows 平台

从二进制安装 MySQL 会遇到将 MySQL 注册为 Windows 服务的问题。可以用 NSSM 解决,但 MySQL 推荐用 mysqld 来注册服务:

D:\mysql-5.7.44-winx64\bin\mysqld --install MySQL --defaults-file=D:\mysql-5.7.44-winx64\my.ini

注: 注册服务时 --defaults-file 参数要在 --install 参数后,否则 mysqld 会尝试启动 MySQL server 而不是注册服务。

MySQL 编码问题

问题表现为,向以 utf8 为编码方式的 MariaDB 中存入一个 UTF-8 字符串,出现了一个错误:

Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1

目前已知,客户端和服务端都使用 UTF-8 编码,要保存的字符串也是合法的 UTF-8 编码。

问题在于 MySQL 的 utf8 实际上不是真正的 UTF-8。

标准 UTF-8 编码方式以 8 位为一个最小编码单位,进行总长可变的编码,将一个 Unicode 码位编码为 1 到 4 个字节。

而 utf8 编码长度最长为三个字节。

这个 bug 一直保留了下来,MySQL 维护组在 2010 年发布了 utf8mb4 的字符集,绕过了这个问题。

然而,他们并没有把加入新字符集这个操作通知到大部分的开发者。

简单概括如下:

所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4 ,永远不要使用 utf8。

MySQL 的 utf8 字符集与其他程序不兼容。

MySQL 配置文件

client 和 mysql 两个 group 的区别

MySQL 的文档里有这么一句:

The [client] option group is read by all client programs provided in MySQL distributions (but not by mysqld).

就是说 [client] 里面的内容可以被 mysql, mysqladmin, mysqldump 等等客户端读取,而 [mysql] 里的内容只能给 mysql 客户端读取。

比如,给一个配置 A:

[client]
user = lsz
password = passwd
port = 3306
host = 127.0.0.1

[mysql]
user = root
password = passwd
port = 3306
prompt = [\u@\p][\d]
no_auto_rehash

使用 mysql 命令连接数据库,最终可以看到连到数据库的是 root 用户。因为 mysql group 在 client group 之后,而后面的 (mysql 中的) 配置会覆盖之前的 (client 中的) 配置。

如果 mysql group 先出现而 client 后出现,那么最终连接到数据库的是 lsz 用户。

同时,不论 mysql group 还是 client group 哪个在前,登陆成功后的 prompt 都是 [\u@\p][\d] 格式的。因为 prompt 出现了一次 (意味着它被配置了),并且只出现了一次 (意味着配置没有被覆盖)。

给一个配置 B:

[client]
user = lsz
password = passwd
port = 3306
host = 127.0.0.1

[mysql]
user = root
password = passwd
port = 3308 # wrong port
prompt = [\u@\p][\d]
no_auto_rehash

使用 mysql, mysqladmin, mysqldump 分别连接,会出现:

给一个配置 C:

[client]
user = lsz
password = passwd
port = 3308 # wrong port
host = 127.0.0.1

[mysql]
user = root
password = passwd
port = 3306
prompt = [\u@\p][\d]
no_auto_rehash

使用 mysql, mysqladmin, mysqldump 分别连接,会出现: