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-13 01:42:40

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

Ubuntu被远程后Num Lock键不停闪临时解决办法

Ubuntu被远程后Num Lock键不停闪临时解决办法: 方法一: 在远程之前先让其关掉自己的Num Lock键 方法二: 关闭Num Lock键 点击System Settings-Keyboard Layout-Options-Use keyboard LED to show alternative layout-选中Num Lock-Close Ubuntu被远程后Num Lock键不停闪临时解决办法,布布扣,bubuko.com

联想网御防火墙内网地址映射不能直接访问临时解决方法

今天到一单位,该单位有个问题想让我解决一下.该单位使用联想网御防火墙保护网络,网络拓扑如图1所示. 图1网络拓扑 单位核心交换机的网段是192.168.0.0-192.168.8.0/24,服务器使用192.168.9.0网段,服务器核心交换机之间采用联想网御防火墙.单位有台服务器内网地址是192.168.9.9,在防火墙上映射了一个公网地址61.n1.n2.n4.在没有映射之前,工作站可以直接使用192.168.9.9这个"内网"地址访问,但在地址映射之后,只能使用"公网&

临时解决ubuntu上deb安装包无法双击打开的问题

昨天折腾了一下,不知道动了哪儿,造成deb安装包无法通过双击打开安装了(双击后无反应,也不知道到哪儿去看错误),还有也发现software manager无法通过菜单中的点击打开了. 下载了virtualbox-4.3_4.3.14-95030~Ubuntu~precise_amd64.deb, 需要更新一下virtualbox,无法通过双击安装. 后来使用命令安装了 sudo dpkg -i virtualbox-4.3_4.3.14-95030~Ubuntu~precise_amd64.de

登录多实例MySQL失败,修改密码临时解决,原因不明

昨天学习第11课"主从同步"的视频(L11-11-MySQL主从同步手把手实战操作详解w),再次遇到问题. [[email protected] ~]# mysql -uroot -p'oldboy3307' -S /data/3307/mysql.sock ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 上个月初学习安装多实例的时候,也遇到过这个报错.查看当时的日记

WP_Image_Editor_Imagick 漏洞临时解决方法

导读 阿里云推送的一条短信通知:存放在上面的WordPress程序有WP_Image_Editor_Imagick漏洞问题,需要登入后台补丁等等的暗示.当然,如果需要在线补丁则需要升级阿里云的安骑士专业版,100元/5台/月.其实对于我们来说我们没有必要去购买这个服务,因为这个漏洞并不是由于Wordpress程序本身造成的,而是由于ImageMagick这个PHP图像处理模块爆出的“0day”漏洞所引发的. 先来说下ImageMagick这个模块,ImageMagick是一个免费的创建.编辑.合

shell实例:临时解决rsync自动断开的问题

需求:公司有两台备份服务器,一主一从,每天晚上8点开始从服务器就开始同步主服务上的一些数据,但是rsync总会断开连接,尝试了好多方法都没有用,写了个脚本临时解决这个问题,如下 #!/bin/bash rsync -avzP --timeout=60 -e "ssh -p X" X.X.X.X:/kejiandata/streams/tarena/streams/* /h zdata/streams/ while ((1 < 100));do     ps aux | grep 

eclipse在高分辨率下图标字体过小问题的临时解决方法

机器:lenovo yoga 2 pro window 8.1 在分辨率3200x1800下eclipse 64位版本图标字体都过小,几乎无法用. 在eclipse出正式fix前的临时解决方法是: 1. 下载eclipse32位版本 2. 调整机器分辨率到2048x1152, scaling factor 150 3. 在windows xp兼容模式下启动eclipse 可作为临时解决方法

服务器临时解决ARP欺骗攻击方法

ARP欺骗的最简单解释: 正常的状态: 你的服务器 --> 网关 --> 经过很多线路后 --> 到达网站访问者电脑 受攻击的状态: 恶意者去攻击网关,把自己的服务器伪装成网关,让你的服务器把他的服务器认为是网关并连接.然后,任意在你传输的数据(网页)中嵌入任意的代码再输送到网站访问者的电脑. 唯一你能查到不同的就是所连接的mac地址是伪装网关的网卡MAC地址,所以很容易判断.可以用这个mac地址去找网络管理员进行查询,但是因为多种原因,有可能机房网管并没办法给你处理. 开始-->

临时解决windows 时间变成了nn 分钟

1.系统装过两次了不知是什么原因造成的系统的时间格式变成了nn 临时解决方法:希望有人能发这个图片发至微软的社区来问下为什么 用着用着就变成了这种了 1:打开"控制面版"--->区域和语言选项-->在"区域选项"里点中"自定义"按钮--->先中"时间"--->在"时间格式"里把"H:mm:ss"改成"h:mm:ss" HKEY_USERS\S-