在调用微信接口的时候,如果遇到包含表情的昵称或者消息的时候,在将数据写入到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 < /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
, 文件
, 编码
, 配置
错误
centos mysql 升级、centos mysql升级5.6、centos升级mysql版本、centos mysql 升级5.7、centos mysql5.1 升级,以便于您获取更多的相关知识。