当时做的图书管理系统用的数据库是SQL Server,但是没法挂载到服务器,所以打算用MySQL代替SQL Server。
一、远程连接
授予数据库远程访问权限
登录MySQL
mysql -u root -p
使用数据库**
use mysql
查看MySQL的操作权限,可见默认的权限都是localhost
select User,authentication_string,Host from user
授予远程主机的访问权限
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘123456’
%代表所有主机,可填写为具体远程主机的ip
刷新权限表的数据
flush privileges;
退出数据库
exit
修改配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
找到下面这行注释掉,保存退出
bind-address = 127.0.0.1
重启MySQL服务
service mysql restart
打开服务器的MySQL端口号
本人用的是阿里云服务器,在控制台找到服务器的安全设置,开放端口(3306)即可。
Python远程连接
测试连接
import pymysql |
二、编码问题
SQL Server默认建完表就直接可以输入中文,但MySQL默认编码是latin1,不支持中文。
因此用python向云服务器上的MySQL插入数据时报错:pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xE5\x95\x8A\xE5\x95\x8A’ for column ‘name’ at row 1”)
解决方法如下:
针对某张表
在建表时手动指定字段编码为utf-8,在字符类型的列名后增加CHARACTER SET utf8
CREATE TABLE book
(
bno bigint AUTO_INCREMENT,
bname VARCHAR(20) CHARACTER SET utf8,
author varchar(20) CHARACTER SET utf8,
amount int
)
更改表编码
alter table tablename default character set utf8;
重启服务
systemctl restart mysqld.service
查看表结构
show create table tablename;
至此,插入数据时的编码问题已解决。
但是在python中使用条件查询时报错:Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation
可见字符编码不一样,不能进行比较,也就是说数据库内部编码有的数据是latin1_swedish_ci,有的数据是utf8_general_ci,,因此解决此问题的核心就是将数据库所有的编码进行统一。
更改数据库编码
alter database <数据库名> character set utf8;
alter table <表名> CONVERT TO CHARACTER SET utf8;
以上方法仅针对具体某个数据库和某张表的编码修改,可谓治标不治本。若想一步到位,必须修改MySQL的默认配置。
centso7下修改MySQL编码为utf8
进入MySQL配置文件
vi /etc/my.cnf
在最后增加
character-set-server = utf8
[client]
default-character-set = utf8[mysql]
default-character-set = utf8
重启服务
systemctl restart mysqld.service
查看MySQL字符集编码
show variables like ‘characterset%’
参数说明:
character_set_client:客户端请求数据的字符集。
character_set_connection:从客户端接收到数据,然后传输的字符集。character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,使 character_set_server 指定的字符集,此参数无需设置。
character_set_filesystem:把操作系统上文件名转化成此字符集,即把 character_set_client 转换 character_set_filesystem,默认 binary 即可。
character_set_results:结果集的字符集。
(6)character_set_server:数据库服务器的默认字符集。
(7)character_set_system:这个值总是 utf8,不需要设置,存储系统元数据的字符集。