由于系统空间原因,师兄建议我将原有服务器中的数据表存放在另外一台服务器上,于是一晚上基本上就忙着在对一台新服务器进行环境的配置。在这个过程中主要遇到下面的几个问题,下面将其总结一下,以便今后工作中可能会遇到。
问题一:远程连接设置
由于要在一台服务器上访问另外一台服务器中的MySQl数据库,所以要对它进行远程可访问设置。这个很简单,结合网上的操作,整理如下:
开启 MySQL 的远程登陆帐号有两大步:
1、确定服务器上的防火墙没有阻止 3306 端口。
MySQL 默认的端口是 3306 ,需要确定防火墙没有阻止 3306 端口,否则远程是无法通过 3306 端口连接到 MySQL 的。
如果您在安装 MySQL 时指定了其他端口,请在防火墙中开启您指定的 MySQL 使用的端口号。
如果不知道怎样设置您的服务器上的防火墙,请向您的服务器管理员咨询。
2、增加允许远程连接 MySQL 用户并授权。
1)首先以 root 帐户登陆 MySQL
在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,MySQL 的 bin 目录下,然后输入下面的命令。
在 Linux 主机中在命令提示行下输入下面的命令。
- [COPY]
- > MySQL -uroot -p123456
123456 为 root 用户的密码。
2)创建远程登陆用户并授权
- [COPY]
- > grant all PRIVILEGES on discuz.* to ted@'123.123.123.123' identified by '123456';
上面的语句表示将 discuz 数据库的所有权限授权给 ted 这个用户,允许 ted 用户在 123.123.123.123 这个 IP 进行远程登陆,并设置 ted 用户的密码为 123456 。
下面逐一分析所有的参数:
all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如:select,insert,update,delete,create,drop 等,具体权限间用“,”半角逗号分隔。
discuz.* 表示上面的权限是针对于哪个表的,discuz 指的是数据库,后面的 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”。
ted 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。
123.123.123.123 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。
123456 为用户的密码。
执行了上面的语句后,再执行下面的语句,方可立即生效。
[COPY]
>
flush privileges
;
-----------------------------------------------------------------------------------------------------------------
解决方法:
1、改表法:
可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从“localhost”改称“%”
x:\>mysql -u root -pvmware
mysql> use mysql;
mysql> update user set host = ‘%’ where user = ‘root’;
mysql> select host, user from user;mysql> flush privileges;
注:mysql> flush privileges; 使修改生效。
授权法:
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword’ WITH GRANT OPTION;
问题二:对MySQL数据库的字符编码设置问题
通过另外一台服务器上的程序将文本文件中的黑名单上传到另外一台服务器的数据表中,由于黑名单中涉及到“地址”字段这种包含中文的字符,所以在上传完之后,发现在数据库端不能正常显示中文,首先想到的是字符编码的问题,照着网上的教程,改了一下编码。发现,还是不对。这时候想到之前写PHP代码的时候,有设计中文编码在网络传输中的转换问题,但是查了之前的PHP源码,发现与这边的问题不同。后来还是坚信是数据库字符编码存在问题。照着网上的方法改了很多次,可能现在显示正确,但是一重启服务器,字符编码又回复原样,主要还是Latin编码。反反复复好几次,最后找到一个帖子,发现要在关闭MySQL的情况下,对配置文件进行更改,然后重新启动MySQL服务,最终可以正常显示。结合该方法,整理如下:
MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8。
-u root –p,之后两次输入root用户的密码),查看数据库的编码方式命令为:
>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
latin1,需要修改为gbk或者是utf8;
character_set_client为客户端编码方式;character_set_connection为建立连接使用的编码;character_set_database数据库的编码;
character_set_results结果集的编码;
character_set_server数据库服务器的编码;
只要保证以上四个采用的编码方式一样,就不会出现乱码问题。
另一个查看数据库编码的命令:
>show variables like ‘collation%’;
linux系统下,修改MySQL数据库默认编码的步骤为:
ü 停止
MySQL的运行
/etc/init.d/mysql start (stop) 为启动和停止服务器
ü MySQL主配置文件为 my.cnf,一般目录为/etc/mysql
mysql相当于windows下mysql的date文件夹
ü 当我们需要修改 MySQL数据库的默认编码时,需要编辑my.cnf文件进行编码修改,在linux下修改mysql的配置文件my.cnf,文件位置默认/etc/my.cnf文件
(如果/etc/mysql/my.cnf下没有my.cnf,可在 /usr/share/mysql拷贝一个.cnf 的文件,如my-small.cnf,重命名为my.cnf进行修改! )
找到客户端配置[client] 在下面添加
default-character-set=utf8 #默认字符集为utf8
在找到[mysqld] 添加
default-character-set=utf8 #默认字符集为utf8
或者(character_set_server=utf8)
init_connect='SET NAMES utf8' #(设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)
修改好后,重新启动mysql 即可,重新查询数据库编码可发现编码方式的改变:
>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
此方法用于标准
mysql版本同样有效,对于/etc/my.cnf文件,需要从mysql/support-files的文件夹cp my-large.cnf一份到/etc/my.cnf
windows系统下可以删除MySQL数据库,并重新安装,在安装过程中可以直接用Mysql Server Instance Config Wizard 进行设置
4、当MySQL数据库服务器已经有数据不适合删除重装时,可以个别指定数据库的编码方式。MySQL指定编码的方式是非常灵活并多样化的,可以指定表级别的编码,行级别编码,甚至可以指定字段级别的编码。
以下示例给出创建数据库时指定编码的两种方式:
DATABASE
ms_db
CHARACTER SET
utf8
COLLATE
utf8_general_ci;
database
if
not
exists
netctoss
default character set utf8;
5、如果你采用的是外部接入的方式,可以在连接中确定请求的编码格式如:jdbc:mysql://localhost:3306 /mysql?useUnicode=true&characterEncoding=utf-8(注意:不要出现任何空格,否则出错)
6、执行脚本:指定编码格式set names gbk(注意,不是UTF-8)可以修改
执行前:
执行后:
set names gbk只可以修改character_set_client、character_set_connection、 character_set_results的编码方式,并且这种修改是窗口级别的,只针对本窗口有效,打开另外一个窗口修改无效。也可发现数据库底层的编码方式没有改变,插入数据后还是以utf8编码方式保持。