在调用微信接口的时候,如果遇到包含表情的昵称或者消息的时候,在将数据写入到MySQL的时候会出现类似 Incorrect string value: '\xF0\x8F...' for column 'XXX' 的错误提示。原因是UTF-8编码有可能是两个、三个或四个字节,而上述中的表情为Emoji表情,在iPhone手机中很常见,很多都是四个字节的。但是MySQL 5.1.x不支持这样四个字节的utf-8编码,只有5.5.x才支持,所以只能将MySQL升级到5.5.x。
1. 安装MySQL
windows下面安装MySQL 5.5.x非常简单,这里不再详述。Linux下面因为从MySQL 5.5开始使用cmake来做config了,所以与之前版本的安装方式不同,这里说明一下不同的地方。
首先安装基础依赖库:
LANG=C
yum -y install gcc-c++ gperf ncurses-devel readline-devel libaio-devel
然后下载编译安装cmake:
wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz
tar xzvf cmake-2.8.12.2.tar.gz
cd cmake-2.8.12.2
./configure && make && make install
安装完成之后可以执行 cmake -version 命令查看cmake是否正常安装。
基础工作做完之后就可以下载安装mysql了,这里以mysql-5.5.36为例:
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.36.tar.gz
tar xzvf mysql-5.5.36.tar.gz
cd mysql-5.5.36
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=yes -DENABLED_LOCAL_INFILE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all
make && make install
其中cmake的安装选项可以在MySQL Source-Configuration Options进行详细的查看,默认情况下MyISAM、MERGE、MEMORY和CSV引擎默认配置是按照的,所以上面只使用 WITH_INNOBASE_STORAGE_ENGINE=1 配置安装了InnoDB引擎。
如果CentOS版本低于6.x的话可能在安装的过程中出现下面的错误:
/root/downloads/mysql-5.5.32/vio/viossl.c: In function ‘ssl_do’:
/root/downloads/mysql-5.5.32/vio/viossl.c:175: 错误:‘SSL_OP_NO_COMPRESSION’ 未声明 (在此函数内第一次使用)
/root/downloads/mysql-5.5.32/vio/viossl.c:175: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
/root/downloads/mysql-5.5.32/vio/viossl.c:175: 错误:所在的函数内只报告一次。)
make[2]: *** [vio/CMakeFiles/vio.dir/viossl.c.o] 错误 1
make[1]: *** [vio/CMakeFiles/vio.dir/all] 错误 2
make: *** [all] 错误 2
这是mysql 5.5.32的一个bug,原因是无法在openssl-1.0.0及更低版本下编译,如果不需要ssl可以去掉WITH_SSL配置项,也可以升级openssl的版本,另外更方便的方法可以在cmake之前打一个补丁:
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.36.tar.gz
tar xzvf mysql-5.5.36.tar.gz
cd mysql-5.5.36
wget -c "http://bugs.mysql.com/file.php?id=19941&bug_id=68999" -O mysql-openssl.patch
patch -p1 < mysql-openssl.patch
然后再进行上面的cmake操作。
最后初始化数据库,先要确保是否创建了mysql用户,如果没有则使用下面命令进行创建
groupadd mysql
useradd -s /sbin/nologin -M -g mysql mysql
设置目录权限并安装数据库
cd /usr/local/mysql
chown -R mysql .
chgrp -R mysql .
# 安装数据库,这里的脚本位置跟5.1.x有所不同
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
如果不是升级的话可以先使用mysql默认的配置文件,然后启动mysql:
# 下面的文件在5.5.x放到了support-files目录下了
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
/etc/init.d/mysql start
# 修改root密码
bin/mysqladmin -uroot password 123
history -c
/etc/init.d/mysql restart
# 开机启动
cat >> /etc/rc.local <<EOF
> /etc/init.d/mysql start
> EOF
2. 修改mysql 5.1.x的配置文件
如果是升级的话使用原来的配置文件之前需要做一些修改,常用的变化的配置项如下:
default-character-set 修改成了 character-set-server,在linux安装的过程中已经指定了编码,所以不需要在配置文件中进行设置,但是windows下需要进行设置
innodb_file_io_threads已经弃用,修改成了 innodb_read_io_threads 和 innodb_write_io_threads
skip-locking 已经弃用,修改成了 skip-external-locking
log-long-format 已经弃用,修改成了 log-short-format
log_slow_queries 已经弃用,修改成了 slow-query-log,并且该参数设置为1启用慢查询日志,0为关闭,使用slow_query_log_file指定日志文件的名称,默认文件名为host_name-slow.log
lower_case_table_name 已经弃用,建议修改成 lower_case_table_names
另外可以把以前的built-in文件格式Antelope改为新的Barracuda格式:
innodb_file_format=Barracuda
linux下为了与windows保持一致,设置表名或字段名的大小写不敏感:
lower_case_table_names=1
3. 原有数据库修复及升级
为了保证数据的完整性,在将旧的数据导入到新数据库中之后(为了方便管理,可以将旧的mysql数据库合并到新的数据库中,然后重新mysql server使其生效),需要使用mysql_upgrade命令升级修复数据库,否则有可能会出现 "Cannot load from mysql.proc. The table is probably corrupted"错误。在mysql的bin目录下执行下面的命令(参数及其含义请见 mysql_upgrade — Check and Upgrade MySQL Tables):
mysql_upgrade -P3300 -uroot -p --force
确保mysql的密码输入正确,否则会出现 FATAL ERROR: Upgrade failed 的错误。
这里需要指出的是,如果在windows环境下执行上述命令会出现下面的错误:
Looking for 'mysql.exe' as: c:\mysql\bin\mysql.exe
FATAL ERROR: Can't execute 'c:\mysql\bin\mysql.exe'
如果执行mysql命令则会出现 “unknown variable 'character-set-server=utf8'” 的错误,这个是mysql的一个bug,可以首先将mysql的配置文件my.ini中的character-set-server全部修改为旧的default-character-set,然后再执行上述命令,执行命令的时候确保mysql服务是启动状态,等到升级完成之后再把配置文件中的default-character-set替换为新的character-set-server。
最后解决最开始说的问题的方法是将表中对应的字段编码由utf-8升级为utf8mb4:
ALTER TABLE `table_name` CHANGE `colum_name` `colum_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL ;
附件:
mysql-openssl.patch
参考资料:
中文写入数据库乱码及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解决
mysql 5.5.17编译安装配置小计
MySQL Source-Configuration Options
SSL_OP_NO_COMPRESSION not defined
【MySQL运维】MySQL5.1升级到MySQ 5.5实战
How to Resolve MySQL Error Code: 1548 Cannot load from mysql.proc. The table is probably corrupted
MySQL Upgrade 5.1 > 5.5
Bug #60316 mysql_upgrade.exe fails on windows 7 x64
How to enable the MySQL Slow query log (5.5.15)
The Slow Query Log
Comments (1)
2012年09月8日
Linux下使用源代码编译方式安装MySQL
Filed under: Database,OS — Jet Ma @ 2:13 上午
Tags: CentOS, linux, mysql
原文出处: Linux下使用源代码编译方式安装MySQL
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!
PS:本文用于安装MySQL 5.1.x,安装MySQL 5.5.x请见 MySQL 5.1.x升级到MySQL 5.5.x。
安装之前最好安装和升级一下所需要的依赖库,参见CentOS中使用yum更新安装依赖库
一、卸载系统中原有的mysql
首先检查一下系统中是否安装了MySQL,如果安装的话先将其卸载。
#查看系统中是否有以rpm方式安装的mysql
[root@localhost /]# rpm -qa | grep -i mysql
# 如果有的话就使用 rpm -e 命令将其卸载,如:
[root@localhost /]# rpm -e MySQL-server-5.1.65-1.glibc23
# 检查系统中是否有mysql服务
[root@localhost /]# chkconfig --list | grep -i mysql
# 如果有的话使用chkconfig --del命令卸载
[root@localhost /]# chkconfig --del mysql
# 查找是否还有mysql文件,然后使用rm -rf将其删除
[root@localhost /]# whereis mysql
# 查找mysql的配置文件,打开my.cnf文件,搜索datadir,然后将对应的目录也删除
[root@localhost /]# whereis my.cnf
# 最后再删除my.cnf文件
二、下载源代码并安装
1. 下载并解压mysql
[root@localhost downloads]# wget -c http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.65.tar.gz/from/http://cdn.mysql.com/
[root@localhost downloads]# tar xzvf mysql-5.1.65.tar.gz
2. 编译安装MySQL
[root@localhost downloads]# cd mysql-5.1.65
[root@localhost mysql-5.1.65]# ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --without-debug --enable-thread-safe-client --enable-assembler --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
[root@localhost mysql-5.1.65]# make && make install
其中configure是用于配置的信息,可以使用./configure --help来查看所有参数的含义。
几个常用的参数:
--prefix=/usr/local/mysql # 指定MySQL程序的安装目录
--with-charset=utf8 # 指定数据库默认的编码
--with-extra-charsets=all # 指定数据库支持的编码,all表示所有,也可以使用gbk,gb2312,utf8指定具体的编码
--without-debug # 去除debug模式,建议启用,提升MySQL性能
--enable-thread-safe-client # 以线程方式编译客户端
--enable-assembler # 使用汇编x86的普通操作符,可以提高性能
--with-client-ldflags=-all-static # 以纯静态方式编译客户端,提高性能
--with-mysqld-ldflags=-all-static # 以纯静态方式编译服务端,提高性能
--with-big-tables # 默认情况下MyISAM单表最大支持2^32条数据,这个参数可以使得这个数字变成(2^32)^2
--with-readline # 通过 readline,可以方便的在命令行上面移动,增删,复制,粘贴,搜索
--with-ssl # 支持SSL连接
--with-embedded-server # 编译成embedded mysql library (libmysqld.a)
--enable-local-infile # 让MySQL支持从本地文件导入数据库
--without-innodb # 禁用InnoDB引擎(MySQL5.1.x之后系统默认不支持innodb引擎)
--with-plugins=innobase # MySQL5.1.x之后,需要使用该方法使MySQL支持innodb引擎
--sysconfdir=/etc/ # MySQL配置文件存放路径,默认为/etc
# 以下选项可以直接在mysql配置文件中设置
--with-tcp-port=3306 # 设定数据库的端口,默认为3306
--with-unix-socket-path=/tmp/mysql.sock # 使用unix套接字链接提高性能,默认为/tmp/mysql.sock
--localstatedir=/usr/local/mysql/database # 日志、数据文件目录
PS:如果发现安装完成之后mysql的安装目录下面没有文件的话,可以看看是否安装的命令打错了。我就是把make && make install 打成了 make && install ,搞了一个下午才找到原因。
3. 创建mysql专用的用户名和用户组
[root@localhost mysql-5.1.65]# groupadd mysql
[root@localhost mysql-5.1.65]# useradd -s /sbin/nologin -M -g mysql mysql
4. 设置权限并安装数据库
[root@localhost mysql-5.1.65]# cd /usr/local/mysql
# 设置安装目录权限给mysql用户和用户组
[root@localhost mysql]# chown -R mysql .
[root@localhost mysql]# chgrp -R mysql .
# 安装数据库
[root@localhost mysql]# bin/mysql_install_db --user=mysql
[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql var
5. 设置mysql的配置文件
# 设置mysql的配置文件,可以根据具体情况来选择
[root@localhost mysql]# cp share/mysql/my-medium.cnf /etc/my.cnf
# 将配置文件中的skip-locking替换为skip-external-locking
[root@localhost mysql]# sed -i 's/skip-locking/skip-external-locking/g' /etc/my.cnf
6. 启动MySQL、设置数据库root的密码并设置为开机启动
[root@localhost mysql]# cp share/mysql/mysql.server /etc/init.d/mysql
[root@localhost mysql]# chmod +x /etc/init.d/mysql
[root@localhost mysql]# /etc/init.d/mysql start
# 设置mysql的root密码
[root@localhost mysql]# bin/mysqladmin -uroot password 123
# 因为操作记录中有密码,所以去除操作记录(可选)
[root@localhost mysql]# history -c
[root@localhost mysql]# /etc/init.d/mysql restart
# 将mysql设置为开机启动(如果使用下面步骤设置为服务则此步骤可以省略)
[root@localhost mysql]# cat >> /etc/rc.local <<EOF
> /etc/init.d/mysql start
> EOF
7. 设置MySQL为服务(可选)
# 首先保证执行了 cp share/mysql/mysql.server /etc/init.d/mysql
# 添加mysql为服务
[root@localhost mysql]# chkconfig --add mysql
[root@localhost mysql]# chkconfig --level 345 mysql on
# 使用服务的方式启动mysql
[root@localhost mysql]# service mysql start
PS: 我在安装innodb支持的时候,看到 http://luoyahu.iteye.com/blog/838450 这篇文章中提到的方式,但是如果在配置项中没有添加--with-plugins=innobase的话,根本就找不到作者所说的“/usr/local/mysql/lib/mysql/plugin/ha_innodb.so”文件,我想应该是非源码安装的方式进行的。
三、启动多个MySQL实例
运行多个实例的话使用 bin/mysqld_multi 程序:
# 使用下面的命令查看配置的实例
[root@localhost mysql]# bin/mysqld_multi --example
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = multi_admin
password = my_password
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/mysql/share/mysql/english
user = unix_user1
[mysqld3]
mysqld = /path/to/mysqld_safe
ledir = /path/to/mysqld-binary/
mysqladmin = /path/to/mysqladmin
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/mysql/share/mysql/swedish
user = unix_user2
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/mysql/share/mysql/estonia
user = unix_user3
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/mysql/share/mysql/japanese
user = unix_user4
例子中[mysqld3]下面前三行的配置项是多余的,可以删除。
首先使用[mysqld_multi]说明一下需要运行多实例的mysql,然后下面的[mysqld2]...[mysqld6]表示多个实例,在实例中分别指定了配置项。mysqldn和mysqld下面的选项内容和含义是一样的。
1. 将下面的配置信息放在my.conf的最后面:
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2 ##数据库的数据文件
user = mysql
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3 ##数据库的数据文件
user = mysql
2. 初始化数据库
# 创建数据库所在的目录并设置权限,需要跟配置文件中设置的一致
[root@localhost mysql]# mkdir /usr/local/mysql/var2
[root@localhost mysql]# mkdir /usr/local/mysql/var3
# 设置权限
[root@localhost mysql]# chown -R mysql /usr/local/mysql/var2
[root@localhost mysql]# chown -R mysql /usr/local/mysql/var3
# 创建数据库文件
[root@localhost mysql]# bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql/var2
[root@localhost mysql]# bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql/var3
3. 启动mysql实例
[root@localhost mysql]# bin/mysqld_multi start 2
[root@localhost mysql]# bin/mysqld_multi start 3
# 查看运行状态
[root@localhost mysql]# bin/mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running
后面的数字对应配置文件中mysqld后面的数字。另外mysqld_multi也支持类似这样的启动/关闭方式:
# 启动选项组[mysql8]和[mysqld10]至[mysqld13],stop也类似
[root@localhost mysql]# bin/mysqld_multi start 8,10-13
注:如果在启动的时候出现 WARNING: my_print_defaults command not found. 的错误的话,需要将mysql安装目录下的bin目录加入环境变量中:
[root@localhost mysql]# vim /etc/profile
# 在文件最后增加一下内容
export PATH=/usr/local/mysql/bin:$PATH
[root@localhost mysql]# source /etc/profile
4. 设置数据库root的密码
# 如果当前root的密码为空则可以不加-p参数
[root@localhost mysql]# bin/mysqladmin -h127.0.0.1 -P3307 -uroot -p password 123
[root@localhost mysql]# bin/mysqladmin -h127.0.0.1 -P3308 -uroot -p password 123
# 使用mysql命令测试(一定加上-h127.0.0.1参数,否则会进入默认的数据库)
[root@localhost mysql]# bin/mysql -h127.0.0.1 -P3307 -uroot -p
5. 将mysql设置为开机启动
[root@localhost mysql]# cat >> /etc/rc.local <<EOF
> /usr/local/mysql/bin/mysqld_multi start 2-3
> EOF
--转自