Mycat(3)临时解决utf8mb4编码问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本文原文连接: http://blog.csdn.net/freewebsys/article/details/45537411 转载请注明出处!1,关于utf8mb4utf8mb4 is a superset of utf8 utf8mb4兼容utf8,且比utf8能表示更多的字符。 emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中

本文原文连接: http://blog.csdn.net/freewebsys/article/details/45537411 转载请注明出处!

1,关于utf8mb4

utf8mb4 is a superset of utf8
utf8mb4兼容utf8,且比utf8能表示更多的字符。
emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)
  表情符号现已普遍应用于手机短信和网络聊天软件。
  emoji表情符号,在外国的手机短信里面已经是很流行使用的一种表情。

2,mycat中支持utf8mb4

走了很多多弯路。理论上只要在server.xml的charset设置下就行,但是没有这么简单。直接连接不上了。

同样配置 utf8 gbk是可以的,但是感觉上utf8mb4这个编码太特殊了,mycat判断可能有bug。

终极必杀:修改源代码,org.opencloudb.mysql.nio.MySQLConnection: 450 行。

    private static CommandPacket getCharsetCommand(int ci) {
            String charset = CharsetUtil.getCharset(ci);
            StringBuilder s = new StringBuilder();
            LOGGER.info("################## MySQLConnection getCharsetCommand: "+ci+"\t|"+charset);
            s.append("SET names utf8mb4 ");//.append(charset);
            CommandPacket cmd = new CommandPacket();
            cmd.packetId = 0;
            cmd.command = MySQLPacket.COM_QUERY;
            cmd.arg = s.toString().getBytes();
            return cmd;
        }

解决办法,直接写死连接设置的编码。当然mysql服务器这边也要修改编码。
vi /etc/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'

客户端查看编码

SHOW VARIABLES LIKE 'character%'
+--------------------------+--------------------+
| 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              |
+--------------------------+--------------------+
rows in set (0.00 sec)

jdbc修改连接:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
jdbc.username=root
jdbc.password=password

修改数据表:(数据库和表字段修改)

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

http://www.tutorialspoint.com/jdbc/jdbc-select-records.htm
测试连接数据库查看字符编码:

//STEP 1. Import required packages
import java.sql.*;

public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/STUDENTS";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";

   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to a selected database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      System.out.println("Connected database successfully...");

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();

      String sql = " show variables like 'character%' ";
      ResultSet rs = stmt.executeQuery(sql);
      //STEP 5: Extract data from result set
      while (rs.next()) {
                //Display values
                System.out.print(rs.getString(1));
                System.out.print("\t");
                System.out.print(rs.getString(2));

                System.out.println();
            }
      rs.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample

如果返回utf8mb4即可:

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
character_sets_dir  /usr/share/mysql/charsets/

更多关于mysql 字符集:http://www.laruence.com/2008/01/05/12.html

3,总结:

本文原文连接: http://blog.csdn.net/freewebsys/article/details/45537411 转载请注明出处!

需要注意的只有mysql 5.5才支持utf8mb4字符集。
centos安装 mysql 5.5 参考:http://stackoverflow.com/questions/9361720/update-mysql-version-from-5-1-to-5-5-in-centos-6-2

mycat设计的还是挺好的,也很稳定的。开源的好处是可以自己研究代码。非常高兴。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
存储 关系型数据库 MySQL
Mysql中utf8和utf8mb4区别
Mysql中utf8和utf8mb4区别
44 0
|
3月前
|
存储 自然语言处理 关系型数据库
👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?
👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?
98 1
|
10月前
|
SQL 存储 数据可视化
【解决方案 二】---设置mysql5.7编码集为utf8mb4
【解决方案 二】---设置mysql5.7编码集为utf8mb4
341 0
|
11月前
|
关系型数据库 MySQL
MySQL 8 默认字符集改成utf8mb4
MySQL 8 默认字符集改成utf8mb4
143 0
|
关系型数据库 MySQL
MySQL的校对规则设置为 utf8mb4_unicode_ci是干什么的?底层原理是什么?
MySQL的校对规则设置为 utf8mb4_unicode_ci是干什么的?底层原理是什么?
132 0
|
数据库
数据库写入中文乱码问题 编码latin1解决方法
数据库写入中文乱码问题 编码latin1解决方法
132 0
|
存储 关系型数据库 MySQL
DataX:导入4字节UTF8编码(生僻字)到Mysql数据库的utf8mb4数据表
MySql数据库的编码支持UFT8字符集。utf-8编码可能是2个字节、3个字节、4个字节的字符,MYSQL的utf-8编码,只支持3个字节的字符。汉字中很多生僻字都是4个字节的字符,日常生活中人的姓名就会有很多高位的生僻字。
5397 0
|
存储 关系型数据库 MySQL
utf8改成utf8mb4实战教程
在 MySQL 中,系统支持诸多字符集,不同字符集之间也略有区别。目前最常用的字符集应该是 utf8 和 utf8mb4 了,相比于 utf8 ,utf8mb4 支持存储 emoji 表情,使用范围更广。本篇文章将会介绍 utf8 修改成 utf8mb4 字符集的方法。
636 0
|
SQL 关系型数据库 MySQL
MySql 8.0 字符编码utf8mb4小实验
MySql 8.0 字符编码utf8mb4小实验
873 0
|
JavaScript 关系型数据库 MySQL
mysql中utf8 ,utf8mb4区别转化方法
mysql utf8 utf8mb4的区别及转化方法
11692 0