MySql踩坑总括,微信公众号基本配备

by admin on 2019年2月4日

  今日安顿了弹指间清晨的token,不过不知道怎么回事就是陈设不成事,在网上找了多的措施也从未解决了这些标题,不过最后做在一个论坛上找到了缓解的不二法门。真是激动的绝不不要的,话不多说平素怼代码。

Activiti新手常见的题材是,计划成功流程后,获取突显的流水线图片(PNG)为乱码,主要浮现为汉语不可以正确突显。在此地分析一下乱码出现的由来,以及解决方案。不喜欢问为啥的同窗可以一直跳到解决措施段落。

衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈

今日向MySQL数据库中的一张表添加含有汉语的多寡,然而老是出非常,检查程序并不曾发现错误,无奈啊,后来重新检讨那张表发现表的编码形式为latin1并且原想可以插入普通话的字段的编码方式也是latin1,然后再度精心考察控制台出口的分外,进一步规定是表和表中字段编码不当导致的,那就修改表和内部对应的字段呗,网上找了片刻,你别说还真有,执行完sql脚本后果真可以存入普通话了,即便如此依旧认为有要求统计一下,古人云:好记性不如烂笔头嘛,呵呵呵。

  那一个是微信公众平台上的配备。

表现

Activiti流程图乱码常见有三种状态:

  1. 装有中文字符变成方块
![](https://upload-images.jianshu.io/upload_images/4770110-6e2cda534300a7ad.png)
  1. MySql踩坑总括,微信公众号基本配备。不无汉语字符变成浮泛汉字
![](https://upload-images.jianshu.io/upload_images/4770110-a3f85b063efed71b.png)

以致那二种意况的荒唐原因以及解决措施并不同,但都与Activiti布置、生成流程图的点子有关。下边先介绍Activiti的流程图生成方式。

转了那么多弯,才晓得难点就在一个地方。睡觉此前想领会了难点,仍旧经验太少。王观堂的治学三境界:

修改表的编码方式:ALTER TABLE `test` DEFAULT CHARACTER SET
utf8;该命令用于将表test的编码方式改为utf8;

  bf88必发唯一官网 1

背景介绍

Activiti中,使用的流程定义一般都是吻合BPMN2.0正经的xml文本文件,后缀能够是.bpmn20.xml,.xml。其中饱含了工艺流程的一体定义内容,包含各节点、节点关联关系,以及用于定义显示的DI元素。

在陈设流程定义时,Activiti引擎会判断,是否同时提供了流程图文件?倘使一起提供了流程图文件,Activiti就省心了,间接运用这几个文件作为流程图。

貌似的话大家都不会先营造好流程图文件再配置,也就是说,安排时唯有一个xml文件。这时候Activiti就须要团结生成对应的流程图文件了。

流程图文件会保存在Activiti的数据库ACT_GE_BYTEARRAY表中,作为BLOB保存。每个流程对应一个流程图文件。从而流程图在布署时就早已规定,除非重新计划或手动处理,否则不管配置怎么修改,呈现的都是初期的流程图。

Activiti用于生成流程图的工具类是

org.activiti.image.impl.DefaultProcessDiagramGenerator

那几个类不止可以生成流程图,仍是可以生成流程运行状态图。具体可以参见其中各艺术的评释。

今儿晚上疾风凋碧树,独上高楼,望尽天涯路

衣带渐宽终不悔,为伊消得人憔悴

众里寻他千百度,蓦然回首,那人却在灯火阑珊处

修改字段的编码方式:ALTER TABLE `test` CHANGE `name` `MySql踩坑总括,微信公众号基本配备。name`
VARCHAR(36) CHARACTER SET utf8 NOT NULL;
该命令用于将表test中name字段的编码格局改为utf8

  那边的url值要直接点到文件上,不然不会成功.  

阴差阳错原因分析

bf88必发唯一官网 2

您可能感兴趣的篇章:

  • 使MySQL可以存储emoji表情字符的设置教程
  • MySQL插入emoji表情战败难题的缓解方法
  • 让Java后台MySQL数据库可以帮忙emoji表情的章程
  • MySQL不可能存储Emoji表情难点的解决办法分析
  • 一应俱全摸底mysql中utf8和utf8mb4的界别
  • MySQL查看与修改当前数据库编码的法子
  • Mysql数据库编码难点(修改数据库,表,字段编码为utf8)
  • MySQL查看和修改字符编码的贯彻方式
  • mysql存储emoji表情报错的拍卖方法【更改编码为utf8mb4】

然后后台的安装

华语字符变成方块

在计划流程时,生成流程图的代码位于

org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy():154 (Activiti 5.22中)

byte[] diagramBytes = IoUtil.readInputStream(processEngineConfiguration.
                    getProcessDiagramGenerator().generateDiagram(bpmnParse.getBpmnModel(), "png", processEngineConfiguration.getActivityFontName(),
                        processEngineConfiguration.getLabelFontName(),processEngineConfiguration.getAnnotationFontName(), processEngineConfiguration.getClassLoader()), null);

bf88必发唯一官网 ,足见在此处,须求在processEngineConfiguration里,保存有正确的LabelFontName,以及AnnotationFontName作为参数,Generator才能科学生成(非英文)的流水线图片。

[TOC]

 1 <?php
 2 namespace app\weixin\controller;
 3 
 4 use think\Controller;
 5 
 6 define("TOKEN", "******");//这里要输入你的token值
 7 
 8 // $wechatObj = new wechatCallbackapiTest();
 9 
10 // $wechatObj->valid();
11 
12 class Wx2 extends Controller {
13     
14     public function index()  
15     {  
16         $echoStr = $_GET["echostr"];  
17   
18         //valid signature , option  
19         if($this->checkSignature()){  
20             ob_clean(); //丢弃缓存中的内容
21             echo $echoStr;  
22             exit;  
23         }  
24     }  
25   
26     public function responseMsg()  
27     {  
28         //get post data, May be due to the different environments  
29         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
30   
31         //extract post data  
32         if (!empty($postStr)){  
33                   
34                 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
35                 $fromUsername = $postObj->FromUserName;  
36                 $toUsername = $postObj->ToUserName;  
37                 $keyword = trim($postObj->Content);  
38                 $time = time();  
39                 $textTpl = "<xml>  
40                             <ToUserName><![CDATA[%s]]></ToUserName>  
41                             <FromUserName><![CDATA[%s]]></FromUserName>  
42                             <CreateTime>%s</CreateTime>  
43                             <MsgType><![CDATA[%s]]></MsgType>  
44                             <Content><![CDATA[%s]]></Content>  
45                             <FuncFlag>0</FuncFlag>  
46                             </xml>";               
47                 if(!empty( $keyword ))  
48                 {  
49                     $msgType = "text";  
50                     $contentStr = "Welcome to wechat world!";  
51                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  
52                     echo $resultStr;  
53                 }else{  
54                     echo "Input something...";  
55                 }  
56   
57         }else {  
58             echo "";  
59             exit;  
60         }  
61     }  
62           
63     private function checkSignature()  
64     {  
65         $signature = $_GET["signature"];  
66         $timestamp = $_GET["timestamp"];  
67         $nonce = $_GET["nonce"];      
68                   
69         $token = TOKEN;  
70         $tmpArr = array($token, $timestamp, $nonce);  
71         sort($tmpArr,SORT_STRING); 72         $tmpStr = implode( $tmpArr );  
73         $tmpStr = sha1( $tmpStr );  
74           
75         if( $tmpStr == $signature ){  
76             return true;  
77         }else{  
78             return false;  
79         }  
80     }
81 
82 
83 }
汉语字符变成浮泛汉字

并发那种难点,基本上都是在Activiti提供的demo程序——Explorer中统筹、安顿流程的时候出现的。原因是demo程序有bug。

Activiti Explorer中提供的Activiti
Modeler,是一个Web流程设计器。用于编辑、保存流程模型。那里请小心,无法用于新建,它生成的也只是流程模型,不是流程定义。生成的流程模型是Json格式的,也保留在ACT_GE_BYTEARRAY表中。

下一场在Activiti Explorer中提供了“安插”的操作。对应的代码为(Activiti
5.22中)(实际有三个布局形式,然则画线布置的是这几个。另一个是填表单形式安顿,难点类似)

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel()

protected void deployModelerModel(final ObjectNode modelNode) {
    BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
    byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);

    String processName = modelData.getName() + ".bpmn20.xml";
    Deployment deployment = repositoryService.createDeployment()
            .name(modelData.getName())
            .addString(processName, new String(bpmnBytes))
            .deploy();

    ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());
}

疏忽是,将Modeler的多少格式(Json
modelNode),转换为Activiti内部调换格式(BpmnModel
model),再转成xmlbyte(byte[]
bpmnBytes),然后在安插的时候再作为String加入布置
.addString(processName, new String(bpmnBytes))

很绕是还是不是?Activiti的开发者也把自己绕晕了,导致那里出现了bug。

public byte[] convertToXML(BpmnModel model) {
  return convertToXML(model, DEFAULT_ENCODING);
}

更换为xmlbyte的章程里,指定了编码形式(为UTF-8)。然而再转回字符串的时候,却尚未点名编码格局!
new String(bpmnBytes)

在未指定编码方式的时候,new
String使用jvm定义的默认编码格局解析,而我辈一般采纳的都是gb2312,因而导致难题。

数据源配置的题材

切切实实可以看
这里

本地连接可以,连接受服务器就是这一个,愣是不行。我刚开首觉得是“APPARENT
DEADLOCK!!!”的难题,各样google方法,试了四次仍旧那一个。都快绝望了,中午体育场馆也在试如故不曾解决。早晨睡觉的时候猛然想起来,我MyEclipse好像屏蔽掉了拥有往外的接连,( ̄▽ ̄;),真是搬起石头砸自己的脚,给自己设置障碍。清晨一来,将延续放手,好题材化解。贴一下DBCP数据源的配置

#数据库驱动
driverClassName=com.mysql.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://服务器地址:3306/dbWaterColInfo
#用户名
username=root
#密码
password=root

#连接池的最大数据库连接数。设为0表示无限制
maxActive=30
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
#接将被标记为不可用,然后被释放。设为0表示无限制
maxIdle=10
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait=1000

#超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) 
removeAbandoned=true
#超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
removeAbandonedTimeout=180

//DBCP管理类,也是从网上找的
package com.kuiblog.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBCPManager {
    private static final Log log = LogFactory.getLog(DBCPManager.class);
    private static final String configFile = "这里替换成你的实际配置文件";

    private static DataSource dataSource;

    static {
        Properties dbProperties = new Properties();
        try {
            dbProperties.load(DBCPManager.class.getClassLoader()
                    .getResourceAsStream(configFile));
            dataSource = BasicDataSourceFactory.createDataSource(dbProperties);

            Connection conn = getConn();
            DatabaseMetaData mdm = conn.getMetaData();
            log.info("Connected to " + mdm.getDatabaseProductName() + " "
                    + mdm.getDatabaseProductVersion());
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            log.error("初始化连接池失败:" + e);
        }
    }

    private DBCPManager(){

    }
    /**
     * 获取链接,用完后记得关闭
     * 
     * @see {@link DBManager#closeConn(Connection)}
     * @return
     */
    public static final Connection getConn() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            log.error("获取数据库连接失败:" + e);
        }
        return conn;
    }

    /**
     * 关闭连接
     * 
     * @param conn
     *            需要关闭的连接
     */
    public static void closeConn(Connection conn) {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException e) {
            log.error("关闭数据库连接失败:" + e);
        }
    }
}

使用DBCP须求导入三个包加一个log包。commons-dbcpcommons-poolcommons-logging

下一场就足以放心大胆的选拔了

  若是那种方法也要命的,唯有修改编码情势来推行了,修改编码格局在网上有很多,自己随便一摸索就出去,

缓解方式

再一次强调,修改之后,必要重新布署或手动生成流程图片,才能见到成效!

数据库编码难题

在出现数据库编码难点此前我还赶上了一个小标题,那就是本身透过DBUtils操作数据库,执行SELECT * FROM userInfos_t可以查询到拥有的内容,然后参数化查询就可怜,比如SELECT * FROM userInfos_t WHERE name='张三',但是SELECT * FROM userInfos_t WHERE id =2却可以,也是百思不得解,行吗。也是数据库编码的难题。固然我在Navicat for mysql中见到的是’张三’,但数据库编码方式并不是UTF8,所以自己查找是寻觅不出来的。

  1. 首先查看数据库的字符集

show variables like 'collation_%';

bf88必发唯一官网 3

那是本人修改未来的,原先的都是latin1

  1. 网上提到了好多缓解办法,一定要细心看。

    自家的Mysql版本是5.7,做了之类修改成功了

    修改/etc/mysql/my.cnf

    [client]
    default-character-set=utf8
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci
    

    怎么找my.cnf

    locate my.cnf
    //如果找不到的话
    updatedb,//然后在查找
    

    重启Mysql服务

    service mysqld restart
    
也可以查看[这篇文章](http://www.pc6.com/infoview/article_63586.html)

来解决

总结
====

暂时的问题就这样多,用了`DBUtil`,没有用`Hibernate`,等以后学习学习再用。

### 文章首发于kuiblog.com。加油

  今日就享受到此处,然后觉得自己写的正确性的请推荐,谢谢

汉语字符变成方块

在Activiti的配备中,加上字体配置即可。

对此Spring用户,在Spring配置文件中找到Activiti流程引擎定义的地点

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseSchemaUpdate" value="true"/>
    ...

在里头添加多少个参数(依照Activiti的本子差异,参数数量不肯定。用IDE提示,把持有带有font的都设置上就好了)。字体可以根据喜好设置,但必要确保tomcat运行时方可找到(例如默许安装的linux服务器很可能就没有)。

<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="annotationFontName" value="宋体"/>

重启tomcat使配置生效,重新安排流程以重新生成流程图。方块字就ok啦。

 

华语字符变成浮泛汉字

是因为难点出在编码格局上,因而有三种修改章程

1. 修改jvm默许参数。

在tomcat的vm运行参数上,加上-Dfile.encoding=UTF-8。但是副成效是引致整个项目都运作在utf-8下,对于写的不谨慎的种类,可能导致其余地点默许使用gb2312编码的代码出错。

2. 修改Explorer计划部分的代码

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel():348
修改为.addString(processName, new String(bpmnBytes, "UTF-8"))即可。

  • 可以直接修改activiti的源码,编译后使用。

  • 也足以在祥和的品类下,手动创制org.activiti.editor.ui.EditorProcessDefinitionDetailPanel类,把Activiti的源码贴进去,再修考订确。那样大家重写的类就会由classloader优先加载,覆盖Activiti自己的兑现,达到修改的目的。

3. 说到底Explorer只是Activiti提供的demo样例。自己写的时候,可以参考Explorer的代码,可别直接拿来用哦。
突显字符为空白

本条严厉来说并不是“乱码”,解决方式也很简短:画流程图的时候,少写几个字,或者把规模拖动搞大一些就能够了~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图