mysql 支持emoji表情
2015-10-29 17:37
597 查看
最近在做一个app项目,我负责后端,Java开发,数据库用的是Mysql,版本5.1.73,编码用的是UTF-8。
但发现了一个问题,iPhone上有Emoji表情,插入Mysql时失败了,报如下异常:
Java代码
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
升级数据库到5.5.3版本以上
参数的更改:
skip-locking 在5.5里已经不识别了,改成skip-external-locking
basedir = /usr/local/mysql5.5
datadir =/usr/local/mysql5.5/data
innodb_data_home_dir = /usr/local/mysql5.5/data
innodb_log_group_home_dir = /usr/local/mysql5.5/data
user = mysql
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 2000
innodb_file_format = Barracuda
第一步:
/usr/local/mysql5.5/bin/mysqld --defaults-file=/etc/my.cnf --skip-grant-tables &
第二步:执行更新程序
[root@ www.linuxidc.com mysql5.5]# bin/mysql_upgrade
Looking for 'mysql' as: bin/mysql
Looking for 'mysqlcheck' as: bin/mysqlcheck
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock'
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock'
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.servers OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
test.heartbeat OK
test.log20111127 OK
test.log20111128 OK
test.log20111129 OK
test.log20111130 OK
test.log20111201 OK
test.log20111202 OK
test.log20111203 OK
test.log20111204 OK
test.log20111205 OK
test.log20111206 OK
test.log20111207 OK
test.t1 OK
test.t2 OK
Running 'mysql_fix_privilege_tables'...
OK
第三步:
/usr/local/mysql5.5/bin/mysqladmin -uroot -p123456 shutdown
第四步:
/usr/local/mysql5.5/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.19-log |
+------------+
1 row in set (0.00 sec)
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.1.8 |
+------------------+
1 row in set (0.00 sec)
至此,升级过程完毕。
上百度Google一下,终于找到了答案。UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。解决方案就是:将Mysql的编码从utf8转换成utf8mb4。网上应该能搜到一大堆修改Mysql编码的方法。
我是这么做的,可能有些修改没有必要,但最终我还是解决了问题:
1. 修改my.cnf
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
修改后重启Mysql
2. 以root身份登录Mysql,修改环境变量,将character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server 都修改成utf8mb4
3. 将已经建好的表也转换成utf8mb4
命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)
至此,OK了!
注 mysql-connector-java-5.1.33.jar
但发现了一个问题,iPhone上有Emoji表情,插入Mysql时失败了,报如下异常:
Java代码
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
升级数据库到5.5.3版本以上
参数的更改:
skip-locking 在5.5里已经不识别了,改成skip-external-locking
basedir = /usr/local/mysql5.5
datadir =/usr/local/mysql5.5/data
innodb_data_home_dir = /usr/local/mysql5.5/data
innodb_log_group_home_dir = /usr/local/mysql5.5/data
user = mysql
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_io_capacity = 2000
innodb_file_format = Barracuda
第一步:
/usr/local/mysql5.5/bin/mysqld --defaults-file=/etc/my.cnf --skip-grant-tables &
第二步:执行更新程序
[root@ www.linuxidc.com mysql5.5]# bin/mysql_upgrade
Looking for 'mysql' as: bin/mysql
Looking for 'mysqlcheck' as: bin/mysqlcheck
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock'
Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/tmp/mysql.sock'
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.servers OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
test.heartbeat OK
test.log20111127 OK
test.log20111128 OK
test.log20111129 OK
test.log20111130 OK
test.log20111201 OK
test.log20111202 OK
test.log20111203 OK
test.log20111204 OK
test.log20111205 OK
test.log20111206 OK
test.log20111207 OK
test.t1 OK
test.t2 OK
Running 'mysql_fix_privilege_tables'...
OK
第三步:
/usr/local/mysql5.5/bin/mysqladmin -uroot -p123456 shutdown
第四步:
/usr/local/mysql5.5/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.19-log |
+------------+
1 row in set (0.00 sec)
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.1.8 |
+------------------+
1 row in set (0.00 sec)
至此,升级过程完毕。
上百度Google一下,终于找到了答案。UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。解决方案就是:将Mysql的编码从utf8转换成utf8mb4。网上应该能搜到一大堆修改Mysql编码的方法。
我是这么做的,可能有些修改没有必要,但最终我还是解决了问题:
1. 修改my.cnf
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
修改后重启Mysql
2. 以root身份登录Mysql,修改环境变量,将character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server 都修改成utf8mb4
3. 将已经建好的表也转换成utf8mb4
命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)
至此,OK了!
注 mysql-connector-java-5.1.33.jar
相关文章推荐
- 关于Mysql的Qcache优化
- saltstack 安装mysql
- PASSION之Mysql集群(一)
- mysql主从复制
- mysql5.6.27安装 总结
- [mysql innodb]mysql for update
- Navicat for MySQL导出表结构脚本的方法
- mysqldatadir 转移
- mysql建库建表的坑你踩了吗
- MySQL的btree索引和hash索引的区别
- MySQL 数据库常用命令小结
- mysql创建唯一索引
- Mysqldump参数大全
- Mysql学习笔记之常用数据类型
- MySql学习笔记_02_mysql的增删改查
- install source mysql 5.7.9
- mysql 基础概念
- MySql取得日期(前一天、某一天)
- Mysql统计总结 - 最近30天,昨天的数据统计
- mysql体系结构