admin 发布的文章

一、中文写入乱码问题


我输入的中文编码是 urf8 的,建的库是 urf8 的,但是插入MySQL总是乱码,一堆"???????????????????????"。可以使用以下的方式试试决解:

原url地址是

jdbc:mysql://localhost:3306/数据库名

改为

jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8

就OK了。

二、Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1


做有关微信公众账号的项目时,报Incorrect string value: '\xF0\x9F\x98\x92' for column 'NIKENAME' at row 1,而所有的字符编码都是 utf8,使用的数据库是 mysql,在测试环境用得好好的,部署到线上后(使用的集群是阿里巴巴的,数据库服务器也是使用它们的,mysql 服务器版本是 5.5.18),就报这个错了,并且这个错,时而出现,时而不出现

Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:

Java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

原因是MySQL里 urf8 编码最多只能支持3个字节,而Emoji表情字符使用的 urf8 编码,很多都是4个字节,有些甚至是6个字节。

解决的方案有两种:

  1. 使用 utf8mb4 的 mysql 编码来容纳这些字符;

  2. 过滤掉这些特殊的表情字符。

方法1:使用utf8mb4的mysql编码来容纳这些字符


注意:要使用 utf8mb4 类型,首先要保证MySQL版本要不低于 MySQL 5.5.3。

第一步:在mysql的安装目录下找到my.ini,作如下修改:

[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'

修改后重启Mysql。

第二步:将已经建好的表也转换成 utf8mb4

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

将 TABLE_NAME 替换成你的表名。然后就OK了。

网上流传的一个版本增加了一个步骤,就是以 root 身份登录 Mysql,修改环境变量,将

character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server

都修改成 utf8mb4。不过我没有做这一步,也正常,所以可能是这一步是多余的。

方法2:过滤掉这些特殊的字符

<hr/>
import org.apache.commons.lang.StringUtils;public class charUtil {    /**
     * 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��
     */
    public static String removeFourChar(String content) {        byte[] conbyte = content.getBytes();        for (int i = 0; i < conbyte.length; i++) {            if ((conbyte[i] & 0xF8) == 0xF0) {                for (int j = 0; j < 4; j++) {
                    conbyte[i + j] = 0x30;// 0x30 int=48   字符=0
                }
                i += 3;
            }
        }
        content = new String(conbyte);        return content.replaceAll("0000", "");
    }    /**
      将emoji表情替换成
     * @return 过滤后的字符串
     * 过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。
     */
    public static String filterEmoji(String source) {        if (StringUtils.isNotBlank(source)) {            return source.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]", "*");
        } else {            return source;
        }
    }    public static void main(String[] arg) {        try {
            System.err.println("测试->将emoji表情替换成*");            String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";
            System.out.println(text);
            System.out.println(text.length());
            System.out.println(text.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", "*"));
            System.out.println(filterEmoji(text));            //输出结果
            //This is a smiley �� face�� �� �� �� �� �� �� 
            //45
            //This is a smiley * face�� �� �� �� �� �� �� 
            //This is a smiley  face       

            System.err.println("测试->替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��");            String title = "ff的范德萨分��������Llfldakf;dsk。f������������daslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k";
            System.out.println(removeFourChar(title));            //输出结果:ff的范德萨分Llfldakf;dsk。fdaslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

<br/>

前言

利用国外服务器买最最便宜的,进行nginx负载均衡转接到国内服务器,域名绑定国外的那台nginx

测试用例

1.国内服务器,根据你需求自己判断买多大

跟平时正常部署程序服务一样就行,我这里随便写一个服务,直接用服务器id可访问,请求如下

2.买一台最最便宜的国外服务器,只部署nginx

在这里插入图片描述

中国历年出生人口

年份人数解释
19461009万
19471122万
19481139万
19491275万
19501419万
19511349万
19521622万
19531637万
19542232万新中国成立 相对稳定 婴儿潮开始
19551965万
19561961万
19572138万
19581889万
19591635万
19601402万
1961949万
19622451万
19632934万
19642721万
19652679万
19662554万
19672543万
19682731万
19692690万
19702710万
19712551万
19722550万
19732447万
19742226万
19752102万
19761849万
19771783万
19781733万
19791715万
19801776万1980年中国开始实行独生子女政策
19812064万50.60后进入结婚生育期
19822230万
19832052万
19842050万
19852196万
19862374万
19872508万
19882445万
19892396万
19902374万
19912250万
19922113万
19932120万
19942098万经济不景气
19952052万
19962057万
19972028万
19981934万金融危机 水灾人口也生得少了?
19991827万
20001765万
20011696万
20021641万
20031594万2003年开始,中国每年人口出生数开始基本稳定
20041588万
20051612万
20061581万
20071591万
20081604万
20091587万
20101588万80后一代进入结婚生育期,高成本导致多数人生一个或者晚生?
20111600万
20121800万龙宝宝大增?
20131640万
20141687万
20151655万
20161786万2016年1月1日我国正式施行“全面二孩政策”
20171723万
20181523万
20191465万
20201200万
20211062万
2022 956万
2023 902万


知识获取:Huginn+RSSHub 获取并 RSS 输出,FreshRSS 订阅 (Android 端:FeedMe 或 Agr Reader)
知识积累:DokuWiki 为主,政策法规等相关文件用 SingleFile (或 archivebox,Readeck 等) 保存为 Html, 按年份存储于 Zdir 的 policies 目录,命名规则为:日期标签 – 文件名.html
待办事项:滴答清单,留言板
日程管理:手机日历 + QQ 邮箱日历 (Caldav 导入)+Fullcalendar (URL 导入)
网络存储:Zdir,Kodexplorer,Filerun
远程连接:Mstsc (Android 端:Microfost 远程桌面,Remote RDP),RustDesk
密码管理:KeePass (网页端:KeeWeb,Android 端:Keepass2Android)+WebDAV
文件同步:Syncthing (双向),FolderSync (手机同步到 Nas)
书签同步:Floccus+WebDAV
单机狗共享:USB Redirector,VirtualHere
虚拟局域网:AnyLink (客户端 AnyConnect),Ocserv (Openconnect VPN Server, 客户端 AnyConnect),SoftEther VPN (客户端系统自带)
服务器监控:Monit
内网穿透:Frp,N2N (电脑端:EasyN2N,Android 端:Hin2n),Vnt
更新监控:Watchtower (Docker 容器),urlwatch
网络唤醒:Lucky (语音唤醒),MyEasyWOL (Android 端广域网唤醒),Wake On Lan (局域网唤醒),PHP 网页唤醒 (自编)
电源管理:GSM 插座 (路由器死机最优解)