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 和 % 这两个就成了。
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
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> 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/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> show full columns from temp_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 | |
+--------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
7 rows in set (0.01 sec)
终于正常!
另外加一句,如果MySQL 服务端设置好之后,JDBC 或者 PHP 连接 MySQL 中文还是有问题,那多半是 Conn 的字符集问题,最好在查询开始前加一句:SET NAMES 'utf8'; 这句相当于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
补充:数据库,mysql教程