utf-8 编码可能2个字节、3个字节、4个字节的字符,但是 MySQL 的 utf8 编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用 utf-8 编码的数据库中插入表情数据,Java 程序中将报SQL异常:

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)

可以对4字节的字符进行编码存储,然后取出来的时候,再进行解码。但是这样做会使得任何使用该字符的地方都要进行编码与解码。

utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。

采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。

更改数据库的编码为utf8mb4:

1. MySQL的版本

utf8mb4 的最低 MySQL 版本支持版本为 5.5.3+,若不是,请升级到较新版本。

2. MySQL驱动

5.1.34 可用,最低不能低于 5.1.13

3. 修改MySQL配置文件

修改 MySQL 配置文件 my.cnf(windows为my.ini)

my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

4. 重启数据库,检查变量

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

Variable_name

Value

character_set_client

utf8mb4

character_set_connection

utf8mb4

character_set_database

utf8mb4

character_set_filesystem

binary

character_set_results

utf8mb4

character_set_server

utf8mb4

character_set_system

utf8

collation_connection

utf8mb4_unicode_ci

collation_database

utf8mb4_unicode_ci

collation_server

utf8mb4_unicode_ci

collation_connection 、collation_database 、collation_server是什么没关系,但必须保证:

系统变量

描述

character_set_client

(客户端来源数据使用的字符集)

character_set_connection

(连接层字符集)

character_set_database

(当前选中数据库的默认字符集)

character_set_results

(查询结果字符集)

character_set_server

(默认的内部操作字符集)

这几个变量必须是utf8mb4。

5. 数据库连接的配置

数据库连接参数中:

characterEncoding=utf8 会被自动识别为 utf8mb4,也可以不加这个参数,会自动检测。

而 autoReconnect=true 是必须加上的。

6. 将数据库和已经建好的表也转换成utf8mb4

更改数据库编码:

ALTER DATABASE caitu99 CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;

更改表编码:

ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;

如有必要,还可以更改列的编码

可以写代码批量进行转换:

//获取所有表

Connection conn = null;

try {

conn = DbUtilsTool.openConn("MySQL", "127.0.0.1", "3306", "caitu99", "root", "root");

String sql = "show tables";

QueryRunner qr = new QueryRunner();

List tblNameList= (List) qr.query(conn, sql, new ColumnListHandler(1));

sql = "ALTER DATABASE caitu99 CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`";

qr.update(conn,sql);

for (String str:tblNameList) {

sql = "ALTER TABLE "+str+" CONVERT TO CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`";

qr.update(conn,sql);

}

}

catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

}

finally {

if(conn!=null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

DbUtilsTool类:

package com.mysql.chartest;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.List;

import java.util.Map;

import org.apache.commons.dbutils.BasicRowProcessor;

import org.apache.commons.dbutils.BeanProcessor;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.ArrayHandler;

import org.apache.commons.dbutils.handlers.ArrayListHandler;

import org.apache.commons.dbutils.handlers.BeanHandler;

import org.apache.commons.dbutils.handlers.BeanListHandler;

import org.apache.commons.dbutils.handlers.ColumnListHandler;

import org.apache.commons.dbutils.handlers.KeyedHandler;

import org.apache.commons.dbutils.handlers.MapHandler;

import org.apache.commons.dbutils.handlers.MapListHandler;

import org.apache.commons.dbutils.handlers.ScalarHandler;

public class DbUtilsTool {

private static final QueryRunner runner = new QueryRunner();

/* 打开数据库连接(type: MySQL,Oracle,SQLServer) */

public static Connection openConn(String type, //数据库类型

String host, //主机ip

String port, //主机端口

String name, //数据库名

String username, //用户名

String password)//密码

{

Connection conn = null;

try {

String driver;

String url;

if (type.equalsIgnoreCase("MySQL")) {

driver = "com.mysql.jdbc.Driver";

url = "jdbc:mysql://" + host + ":" + port + "/" + name;

} else if (type.equalsIgnoreCase("Oracle")) {

driver = "oracle.jdbc.driver.OracleDriver";

url = "jdbc:oracle:thin:@" + host + ":" + port + ":" + name;

} else if (type.equalsIgnoreCase("SQLServer")) {

driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";

url = "jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + name;

} else {

throw new RuntimeException();

}

Class.forName(driver);

conn = DriverManager.getConnection(url, username, password);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

/* 关闭数据库连接 */

public static void closeConn(Connection conn) {

try {

if (conn != null) {

conn.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

/* 查询(返回Array结果) */

public static Object[] queryArray(Connection conn, String sql, Object... params) {

Object[] result = null;

try {

result = runner.query(conn, sql, new ArrayHandler(), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询(返回ArrayList结果) */

public static List queryArrayList(Connection conn, String sql, Object... params) {

List result = null;

try {

result = runner.query(conn, sql, new ArrayListHandler(), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询(返回Map结果) */

public static Map queryMap(Connection conn, String sql, Object... params) {

Map result = null;

try {

result = runner.query(conn, sql, new MapHandler(), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询(返回MapList结果) */

public static List> queryMapList(Connection conn, String sql, Object... params) {

List> result = null;

try {

result = runner.query(conn, sql, new MapListHandler(), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询(返回Bean结果) */

public static T queryBean(Class cls, Map map, Connection conn, String sql, Object... params) {

T result = null;

try {

if (map != null) {

result = runner.query(conn, sql, new BeanHandler(cls, new BasicRowProcessor(new BeanProcessor(map))), params);

} else {

result = runner.query(conn, sql, new BeanHandler(cls), params);

}

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询(返回BeanList结果) */

public static List queryBeanList(Class cls, Map map, Connection conn, String sql, Object... params) {

List result = null;

try {

if (map != null) {

result = runner.query(conn, sql, new BeanListHandler(cls, new BasicRowProcessor(new BeanProcessor(map))), params);

} else {

result = runner.query(conn, sql, new BeanListHandler(cls), params);

}

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询指定列名的值(单条数据) */

public static T queryColumn(String column, Connection conn, String sql, Object... params) {

T result = null;

try {

result = runner.query(conn, sql, new ScalarHandler(column), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询指定列名的值(多条数据) */

public static List queryColumnList(String column, Connection conn, String sql, Object... params) {

List result = null;

try {

result = runner.query(conn, sql, new ColumnListHandler(column), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 查询指定列名对应的记录映射 */

public static Map> queryKeyMap(String column, Connection conn, String sql, Object... params) {

Map> result = null;

try {

result = runner.query(conn, sql, new KeyedHandler(column), params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/* 更新(包括UPDATE、INSERT、DELETE,返回受影响的行数) */

public static int update(Connection conn, String sql, Object... params) {

int result = 0;

try {

result = runner.update(conn, sql, params);

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

}

mysql修改7tf8mb4_更改MySQL数据库的编码为utf8mb4相关推荐

  1. 修改mysql用utf8mb4_更改MySQL数据库的编码为utf8mb4

    原文:http://blog.csdn.net/woslx/article/details/49685111 utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3 ...

  2. mysql修改数据库编码mb4_更改MySQL数据库的编码为utf8mb4

    utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...

  3. mysql 更改数据库编码_更改MySQL数据库的编码为utf8mb4

    utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...

  4. mysql改utf8mb4后速度慢_更改MySQL数据库的编码为utf8mb4

    更改MySQL数据库的编码为utf8mb4 utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符. 采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑微信昵称 ...

  5. 更改MySQL数据库的编码为utf8mb4

    utf-8编码可能1个字节.2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持最多3字节的数据,也就是说mysql最开始的时候,对utf-8的支持是不完整的.而emoji表情字符是 ...

  6. mysql修改服务器ip,mysql数据库修改服务器ip

    mysql数据库修改服务器ip 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制,用来提高实例的稳定性和安全性,具体详见表1. 云数据库RDS服务支持开启公网访问功能,通过弹性 ...

  7. mysql 修改字段注释_MySQL数据库+命令大全,人手一份的实操攻略来啦

    有很多朋友虽然安装好了MySQL但却不知如何使用它.在这篇文章中我们就从连接MySQL.修改密码.增加用户等方面来学习一些MySQL的常用命令,再看看MySQL在数据库方面的操作是如何执行的. 连接M ...

  8. mysql修改数据列_MySQL数据库修改一列内容

    匿名用户 1级 2018-07-05 回答 下面列出: 1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加 ...

  9. mysql 修改表 引擎,mysql如何修改表类型(表引擎)

    参考阅读:http://www.manongjc.com/article/1205.html 最近遇到一个修改 MySQL 表类型的问题,以前在 phpmyadmin 管理 mysql 数据库时,建立 ...

最新文章

  1. springBoot 打war包 程序包com.sun.istack.internal不存在的问题
  2. matlab 算法集锦
  3. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)
  4. springcloud 注解 @EnableDiscoveryClient 与 @EnableEurekaClient 的区别
  5. android 打印机列表中,在android中打印只搜索打印机
  6. Python求最大公约数和最小公倍数
  7. Axure经典实例高保真交互下载(微信元件高保真交互库+微信原型交互+安卓设备模板含登录注册引导欢迎流程+ios苹果设备模板)
  8. 咸菜可以吃吗,对健康有害吗?
  9. 创建数据库是列名无效咋办_linux中sqlite3数据库的移植和使用(入门篇)
  10. 2021华为机考笔试题
  11. 用python做生信_1 python生信入门
  12. 重启计算机有什么用,强制重启电脑有什么危害
  13. word---尾注法插入参考文献
  14. java判断子串重复_判断字符串是否是由子串重复多次构成
  15. [Azure][Event hub]Kafka无法同时连接到同一个namespace下的两个Event hub
  16. 一道经典的面试题:一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(编写java程序)...
  17. Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for module r8169
  18. HTTP和RTSP简介
  19. 云服务器和真实服务器,个人网站主机选择原则 看配置也要看是不是有助于优化...
  20. 低通滤波器计算截止评率_技术货:滤波器带宽及对应RC的计算

热门文章

  1. [Linux] Linux常用网站
  2. tp5 + layui 上传图片[支持单张和多张 ]
  3. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
  4. CAnimation-模拟时钟
  5. 开发extjs常用的插件
  6. java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--前篇
  7. Django_modelform组件
  8. wordpress 伪静态nginx设置
  9. 弹性升级诀窍分享:让双11来的更猛烈些吧
  10. 关于C语言的指针、链表的原理和各类操作