mysql 相关
sophister opened this issue · comments
今天在给一个table列增加 unique key
的时候,mysql报错
Specified key was too long; max key length is 767 bytes
当时 column 是 varchar(200)
,mysql字符集是 utf8mb4
,原来在这个字符集下,1个字符对应4个字节,超出了限制。
You also have to be aware that if you set an index on a big char or varchar field which is utf8mb4 encoded, you have to divide the max index prefix length of 767 bytes (or 3072 bytes) by 4 resulting in 191. This is because the maximum length of a utf8mb4 character is four bytes. For a utf8 character it would be three bytes resulting in max index prefix length of 254.
mysql下保存emoji表情
首先非常明确的是,表中的列的类型,不能是utf8,一般按照如下修改顺序:
- 修改mysql服务器配置文件
my.cnf
文件
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 最后面这个我没改,保持的默认值,因为是 maria 数据库,可能有些配置和mysql有出入
character-set-client-handshake = false
- 将对应数据库、表、字段的类型修改
# 将数据库转换为utf8mb4
ALTER DATABASE erp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 将已经建好的表也转换成utf8mb4
ALTER TABLE `erp_comment` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 将需要使用emoji的字段设置类型为
ALTER TABLE `erp_comment` MODIFY COLUMN `comment` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 修改代码里 mysql 连接参数的配置,我是用的 node.js 的
mysql
这个包,操作是设置charset: 'utf8mb4'
即可
上述mysql服务端配置修改完重启之后,可以连上mysql客户端之后,执行如下命令确认下:
SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';
CentOS 7/8 下mariadb创建用户、授权
创建用户
命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:
username - 你将创建的用户名,
host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%.
password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.
例子:
CREATE USER 'm23100'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'm23100'@'192.168.1.101' IDENDIFIED BY '123456';
CREATE USER 'm23100'@'%' IDENTIFIED BY '123456';
CREATE USER 'm23100'@'%' IDENTIFIED BY '';
CREATE USER 'm23100'@'%';
用户授权
命令: GRANT privileges ON databasename.tablename TO 'username'@'host'
说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等.如果要授予所的权限则使用ALL.;
databasename - 数据库名,
tablename-表名,
如果要授予该用户对所有数据库和表的相应操作权限则可用 * 表示, 如 .
例子:
GRANT SELECT, INSERT ON test.user TO 'm23100'@'%';
GRANT ALL ON *.* TO 'm23100'@'%';
flush privileges; # 刷新权限
查看&撤销用户授权
# 查看用户授权
show grants for hello@localhost;
# 撤销权限
revoke create on *.* from hello@localhost;
# 发现没有create权限了
show grants for hello@localhost;
# 删除用户
drop user hello@localhost;
重启服务相关
systemctl start mariadb #启动MariaDB
systemctl stop mariadb #停止MariaDB
systemctl restart mariadb #重启MariaDB
systemctl enable mariadb #设置开机启动
文章内容字段,最好用longtext,不用 text
本以为文章内容,使用 text
类型就够了,结果一来就遇到超出长度限制的问题。搜了下 wordpress 的数据库设计,原来他们的文章内容就是用的 longtext
,链接如下:https://codex.wordpress.org/Database_Description#Table:_wp_posts