现在mysql数据库使用的人越来越多了,同时问题也是越来越多了,下面我总结了一些常用见的在mysql使用过程中碰到的一些问题解决办法.
MySQL Workbench 无法使用
之前是用的 XAMPP 的 MySQL 组件,以前的使用相对比较简单,只是把数据库导入进去之后就在 Web 上直接用了,没有发现这个组件存在的问题,今天用 MySQL Workbench 访问这个库,发现报各种错误,主要的意思是/var/folders/下的某个诡异的目录没有读写权限,更改了目录读写权限后也是错误依旧,本来猜测是 Workbench 自己的原因,后来下载的新的版本也还是不能行,查看 MySQL 数据文件夹下的 err 文件,发现这个 MySQL 服务组件居然报了n多乌七八糟的错误,看来这个服务端已经不能要了,重新下载了个官方的 MySQL for Mac 版本,mysql-5.5.17-osx10.6-x86.dmg,装上去把库也挂上去,Workbench 居然好了.
由此看来,当 Workbench 出问题的时候,先不要着急骂 Workbench,看看自己的库是不是已经危了.
MySQL 访问权限
MySQL 比较白痴,127.0.0.1 和 localhost 不知道是一码事,在权限表里面是分开的。在修改密码的时候,一开始只改了1行,把localhost 改成了 %,登陆进去也好好的,但就是看不到库,比较让人崩溃,后来把两行都重新设置了才正常,另外,如果加外面的访问 % 的时候,最好单加一行,别把原来的删掉,不然也会容易错乱.
如果新创建用户,并且开通访问权限,其实写 localhost 和 % 这两个就成了.
- GRANTALLPRIVILEGESON*.*TO'user'@'localhost'IDENTIFIEDBY'password'WITHGRANTOPTION;
- GRANTALLPRIVILEGESON*.*TO'user'@'%'IDENTIFIEDBY'password'WITHGRANTOPTION;
- FLUSHPRIVILEGES;
MySQL JDBC 连接
JDBC 访问 MySQL 的连接方式有点奇怪,用 127.0.0.1 可以正常访问,但是 localhost 会被拒绝,粗略看了下原因,如果是 localhost,在连接的时候会用本地的 IP 地址直接访问,如果这个IP 地址不在 MySQL 的访问权限表里,就会被拒绝掉,这个问题在 PHP 下面就没有发生,深层次的原因有空的时候好好分析分析.
MySQL 编码
MySQL 的编码总是非常恶心,用默认的配置启动,在程序里插入中文,提示:error 1336 (HYOOO):Incorrect string values:...
首先,考虑是服务器编码的问题,在my.cnf 的[mysqld]里面添加了:
character_set_server = utf8
在 MySQL 里确认字符集已均改为utf8,代码如下:
- mysql>SHOWVARIABLESLIKE'character%';
- +--------------------------+-----------------------------------------------------+
- |Variable_name|Value|
- +--------------------------+-----------------------------------------------------+
- |character_set_client|utf8|
- |character_set_connection|utf8|--phpfensi.com
- |character_set_database|utf8|
- |character_set_filesystem|binary|
- |character_set_results|utf8|
- |character_set_server|utf8|
- |character_set_system|utf8|
- |character_sets_dir|/usr/local/mysql-5.5.17-osx10.6-x86/share/charsets/|
- +--------------------------+-----------------------------------------------------+
但是,中文数据依然无法插入,错误依旧,考虑库和表的字符集的问题,更改库字符集:
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8;
依旧不行,更改原表的字符集:
ALTER TABLE temp_table DEFAULT CHARACTER SET utf8;
依旧还是不行,再继续把表默认的字符集和所有字符列,CHAR,VARCHAR,TEXT,改为新的字符集:
ALTER TABLE temp_table CONVERT TO CHARACTER SET utf8;
确认查看各个列的字符集:
- mysql>showfullcolumnsfromtemp_table;
- +--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
- |Field|Type|Collation|Null|Key|Default|Extra|Privileges|Comment|
- +--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
- |No|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Name|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Price|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Count|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Date|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Source|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- |Export|varchar(100)|utf8_general_ci|YES||NULL||select,insert,update,references||
- +--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
- 7rowsinset(0.01sec)
终于正常.
另外加一句,如果MySQL 服务端设置好之后,JDBC 或者 PHP 连接 MySQL 中文还是有问题,那多半是 Conn 的字符集问题,最好在查询开始前加一句:SET NAMES 'utf8'; 这句相当于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;