从二进制安装 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 而不是注册服务。
问题表现为,向以 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 的文档里有这么一句:
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 分别连接,会出现: