您的位置:首页 > 数据库 > MySQL

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: