mysql5.6默认字符集设置及过程中踩到的坑
修改默认字符集,是个很常见的需求,应该也不难搞,可偏偏过程比较神奇。
MACOS X Yosemite
系统,使用mysql官网下载的dmg文件,直接安装,安装目录为/usr/local/mysql
,即为basedir,配置文件my.cnf即在basedir中。
MySQL Preference Pane
利用MySQL Preference Pane
,也就是mac的系统偏好设置
里的配置面板,实现管理mysqld,下文中的重启均是利用此管理工具。
它的启动配置文件路径为:
/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
mysqld的启动参数包含在上述配置文件中:
/usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid
my.cnf
修改my.cnf,增加默认字符集配置,在[client]
和[mysqld]
区块中都增加default-character-set=utf8
。然后重启服务器,结果,字符集没有任何变化。
mysqld --print-defaults # 查看默认启动参数
修改配置文件并没有改变以上命令的输出,由此可知,服务器根本就没有读取该配置文件
。
既然服务器没有自动读取,那我希望通过手动提供参数来实现,通过以下命令求助:
mysqld --verbose --help
发现输出中包含以下内容:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
恍然大悟,根本就没有读到my.cnf的路径/usr/local/mysql/my.cnf,修复方式如下:
sudo mkdir etc
sudo ln -s /usr/local/mysql/my.cnf /usr/local/mysql/etc/
配置文件成功读取,不过又遇到了新的问题~~
character-set-server = utf8
启动过程中报错:
/usr/local/mysql/bin/mysqld: unknown variable 'default-character-set=utf8'
原来是mysql5.0之后,这个配置选项已经废弃,直接启用新的配置选项即可:
character-set-server = utf8
collation-server = utf8_unicode_ci
init_connect = 'SET collation_connection = utf8_unicode_ci; SET NAMES utf8;'
skip-character-set-client-handshake
重启服务器,然后连接,在mysql shell中,使用以下命令检验:
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.6.35-macos10.12-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+
mysql> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+