sophister / 2bugua5

工作、生活的碎碎念

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

mysql 相关

sophister opened this issue · comments

commented

今天在给一个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.

这篇stackoverflow可以看看

commented

mysql下保存emoji表情

首先非常明确的是,表中的列的类型,不能是utf8,一般按照如下修改顺序:

  1. 修改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
  1. 将对应数据库、表、字段的类型修改
# 将数据库转换为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;
  1. 修改代码里 mysql 连接参数的配置,我是用的 node.js 的 mysql这个包,操作是设置 charset: 'utf8mb4' 即可

上述mysql服务端配置修改完重启之后,可以连上mysql客户端之后,执行如下命令确认下:

SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';
commented

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 #设置开机启动
commented

文章内容字段,最好用longtext,不用 text

本以为文章内容,使用 text 类型就够了,结果一来就遇到超出长度限制的问题。搜了下 wordpress 的数据库设计,原来他们的文章内容就是用的 longtext ,链接如下:https://codex.wordpress.org/Database_Description#Table:_wp_posts