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

本文原文连接: 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设计的还是挺好的,也很稳定的。开源的好处是可以自己研究代码。非常高兴。

时间: 2024-10-26 05:37:12

Mycat(3)临时解决utf8mb4编码问题的相关文章

win7安装kb3038314补丁失败临时解决方法

  win7安装kb3038314补丁失败临时解决方法          win7安装kb3038314补丁失败临时解决方法来啦!win764位的用户安装4月补丁日提供的IE积累性安全更新KB3038314后遇到安装失败的问题,错误代码80092004,这样子该怎么办呢?下文小乐哥分享win7安装kb3038314补丁失败临时解决方法,一起来看看吧! 目前微软还在解决该问题,新的补丁仍然没有发布.不过高手一直都在民间,在微软Community论坛上,有一位网友提供了该问题的临时解决办法,有很多网

java-filter解决字符编码失效

问题描述 filter解决字符编码失效 我在filter中配置的编码类型是ISO-8859-1但是查看时总是UTF-8 解决方案 CharacterEncodingFiltercn.jbit.housestruts.filter.CharacterEncodingFilter encodingGBK CharacterEncodingFilter/* import javax.servlet.FilterConfig; import javax.servlet.ServletException;

关于ADSL用户80端口被封WEB服务器的临时解决办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近期全国都在查WAP,查备案,很多站长朋友所处地区已全面封禁80端口,对于本地架设网站的站长朋友们,带来不小的损失,这里跟大家说一下临时的解决办法. 1,网站改其它端口,如81 2,修改原别名解析的主域名,如原来www 指向的花生壳或者每步域名,改www为go 3,增加一条URL转发,www转发至 go.***.com:81 隐藏转发,或者不

在Action中怎么解决Ajax编码问题啊!急救....

问题描述 今天在做CRM项目的时候发现要用到Ajax,但是到了Action中就成了乱码了!不清楚是怎么一回事情,编码格式是UTF-8就是不行,希望高手门帮帮忙帮小弟解决下谢谢! 解决方案 解决方案二:在页面上对传输的中文用:encodeURI(encodeURI(param))在action中URLDecoder.decode(request.getParameter("param"),"utf-8");解决方案三:呵呵!你试过吗??我不怎么清楚,在页面上这句话应该

ADSL封禁80端口本地架设网站临时解决办法

近期全国都在查WAP,查备案,很多站长朋友所处地区已全面封禁80端口,对于本地架设网站的站长朋友们,带来不小的损失,这里跟大家说一下临时的解决办法. 1,网站改其它端口,如81 2,修改原别名解析的主域名,如原来www 指向的花生壳或者每步域名,改www为go 3,增加一条URL转发,www转发至 go.***.com:81 隐藏转发,或者不隐藏均可. 4:IIS里,绑定此主机头 以上三步,即可解决封禁80端口后带来的用户流失的影响.

IIS 6.0的ASP目录漏洞与分号漏洞临时解决方法

先说解决方法:下载 银月服务器工具,使用工具->组件下载器下载ISAPI_Rewrite,解压出来. 把ISAPI_Rewrite中的ISAPI_Rewrite.dll添加为ISAPI,名字为ISAPI_Rewrite,这就是伪静态,做过的不用安装了. 下载http://www.aliyun.com/zixun/aggregation/35161.html">漏洞补丁包,即下图选择的项目,下载打开!

针对aspx木马可以读取iis站点信息,跨网站目录的临时解决方法_win服务器

1.aspx 木马文件可以在asp.net空间中实现读取进程.iis信息.跨站.执行cmd命令. 解决方法 1.对于每个网站建立一个用户.并将用户放入guest组,给站点写入.读取的权限.并在iis上允许匿名访问. 2. 复制代码 代码如下: <system.web> <identity impersonate="true" /> </system.web> 将以上代码复制到C:\WINDOWS\Microsoft.NET\Framework\v2.

IIS下ASP目录漏洞和IIS分号漏洞(;)的临时解决方法_win服务器

解决方法: 下载 银月服务器工具,使用工具->组件下载器下载ISAPI_Rewrite,解压出来. 把ISAPI_Rewrite中的ISAPI_Rewrite.dll添加为ISAPI,名字为ISAPI_Rewrite,这就是伪静态,做过的不用安装了 下载漏洞补丁包,即下图选择的项目,下载打开! 把ISAPI_Rewrite目录中的httpd.ini替换成补丁包中的httpd.ini. 或者保证ISAPI_Rewrite下面的httpd.ini有下图选择的两行规则也行!这样就能防止这两个IIS漏洞

jQuery中的bind绑定事件与文本框改变事件的临时解决方法_jquery

一直没什么兴趣看jQuery,就用自己那点不咋样的javascript硬撑着,今天写一个功能时想尝试一下,用bind注册事件时发现怎么都不好使 复制代码 代码如下: $("#txtStation").bind("onpropertychange", GetStationLevel); 然后onclick之类的都试了,没一个能用的,无奈去翻jQuery的API,都是鸟语我也看不懂具体说了点了,但是发现bind注册事件都是没有on的. 发现有change事件,试了试 复