开心一笑
【真的很羡慕那些五一放假可以出去玩的朋友
像我们这种一年四季随时可以出去玩的人,是根本没法体会那种激动的心情】
提出问题
Intellij IDEA 控制台缓存区大小如何修改???
PostgreSql的唯一性索引引发的问题???
Base64图片编码转换问题???
postgresql数据库编码问题???
解决问题
前言
这2天工作中,碰到了4个问题,耗了好多时间,整理分享下。
Intellij IDEA 控制台缓存区大小修改
业务场景
一份 user.xls 文件,里面有1000条数据。通过自己写的代码,将这1万条数据生成 sql 语句,打印到控制台。 由于 Intellij IDEA 控制台默认的缓存区只有 1024 KB,超过大小限制的就会被清除,而且还会显示【too much output to process】
解决方案
可通过如下配置界面进行修改Override console cycle buffer size(Settings→Editor→General→Console),单位为KB
完美解决......
PostgreSql的唯一性索引引发的问题
业务场景
数据库有一张表 NewTable
CREATE TABLE "public"."NewTable" (
"id" varchar(32) NOT NULL,
"name" varchar(100),
"code" varchar(100),
PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;
//这里由于误操作,建立了一个唯一索引
CREATE UNIQUE INDEX "idx_code" ON "public"."NewTable" USING btree ("code");
在数据库客户端执行如下脚本:
//插入一条数据
INSERT INTO "public"."ay_test" ("id", "name", "code") VALUES ('1', '1', '1');
//插入一条数据,这里code和上一条数据code一样
INSERT INTO "public"."ay_test" ("id", "name", "code") VALUES ('2', '1', '1');
报错:
[SQL]INSERT INTO "public"."ay_test" ("id", "name", "code") VALUES ('2', '1', '1');
[Err] ERROR: duplicate key value violates unique constraint "idx_code"
DETAIL: Key (code)=(1) already exists.
解决方案
解决方法也是比较简单的:
//删除索引
DROP INDEX "idx_code" ;
//创建索引(注意不是唯一索引)
CREATE INDEX "idx_code" ON "public"."ay_test" USING btree ("code");
//插入数据验证
INSERT INTO "public"."ay_test" ("id", "name", "code") VALUES ('3', '1', '1');
INSERT INTO "public"."ay_test" ("id", "name", "code") VALUES ('4', '1', '1');
唯一索引知识补充
当前只有B-tree索引才能使用唯一性索引,唯一性索引可以使单字段和多字段绑定在一个索引上。
当一个索引被定义为唯一性索引时,那么无论是单字段还是多字段的索引,其涉及到的字段在表中的值是不能重复的,类似于主键和联合主键的意思。需要注意的是 null 值是不相等的,即第一行某字段为null第二行该字段也为null,那么这两个字段值不相等。
Base64图片编码转换问题
业务场景
由于公司手机APP端需要下载图片,要求后端返回的图片是经过Base64位编码过的字符串,中间也废了好多时间,特意整理下。
解决方案
这里只贴出部分代码:
@Override
public String download(String id) throws Exception {
SysAttachment sysAttachment = (SysAttachment)sysAttachmentService.findById(id);
String name = sysAttachment.getName() + this.POINT + sysAttachment.getType();
String path = sysAttachment.getPath();
FileInputStream in = null;
byte[] b = null;
try {
File file = new File(path);
if (file.exists()) {
try {
//文件inputStream
in = new FileInputStream(path);
b = new byte[in.available()];
in.read(b);
} finally {
if (in != null) {
in.close();
in = null;
}
}
} else {
throw new ResourceNotFoundException("文件: \"" + name + "\"不存在!");
}
} catch (IOException var8) {
throw new SystemException(ErrorCode.Common.downloadFailed);
}
// 对字节数组Base64编码(这里是重点)
return Base64.encodeBase64String(b);
}
这里使用 Base64.encodeBase64String(b) 而不使用
BASE64Encoder encoder = new BASE64Encoder();
encoder.encode(data);//返回Base64编码过的字节数组字符串
因为根据RFC822规定,BASE64Encoder编码每76个字符,还需要加上一个回车换行
部分Base64编码的Java库还按照这个标准实行。
换用Apache的 commons-codec.jar, Base64.encodeBase64String(byte[])得到的编码字符串是不带换行符的。
postgresql数据库编码问题
业务场景
执行数据库查询的时候,控制台出现如下错误:
Cause: org.postgresql.util.PSQLException: ERROR: character with byte sequence 0xc2 0xa0 in encoding "UTF8" has no equivalent in encoding "GBK"
解决方案
原因是客户端字符集和插入内容的字符集不匹配。PostgreSQL默认不做字符集转换,如果数据库是UTF8的字符集,一般终端的中文字符集会设置为GBK(可以看LANG环境变量确认),所以这个编码不经转换的存入数据库中,而数据库是UTF8的,PostgreSQL发现不是UTF8编码,就报上面的错。
要想打开自动字符集转换功能,必须告诉 pg 客户端使用的字符集。这时可以设置pg客户端编码为GBK,pg就会自动做字符集转换。
读书感悟
来自《愤怒的葡萄》
- “住惯了的地方是很难离开的,”凯绥说。“想惯了的道理也很难丢掉。“
- “不存过高的希望,就不会让失望给搞垮。”
经典故事
【苍蝇发现自己模样很像蜜蜂,十分高兴,打算冒充蜜蜂去花丛里欺骗花的感情、盗取花蜜。可是它在花丛里飞来飞去不知飞了几个来回,却不见有一朵花向它绽放笑脸,他十分不解,转头问蜜蜂到底原因何在?蜜蜂笑着回答说:”你只是外形像我,事实上并不是我!因此,即使是一辈子蹲在花丛里,花也不会把你当成我!“
启示:外表可以相似,但内涵却是无法取代的。】
生活常识
【披萨正确吃法】
- 吃比萨饼时应将已切好的饼(厨师已切好)取一块放入自己的餐盘中用刀、叉食用。
- 食用前可按自己口味加上一些胡椒。
- 切好的饼呈三角状,左手拿叉、右手拿刀的人将饼的尖端转向左侧,从此处下刀。
- 要切一块吃一块,先切碎再吃不雅观,也不易保持温度。
【拿铁的正确喝法】
- 一般是先用咖啡勺,搅匀了之后,在饮用。喝时咖啡勺不要留在杯中。
- 饮用拿铁之前可以先喝一杯冰水,充实浮现咖啡的味道。
- 拿铁咖啡的饮用量要天天节制在1杯以内。
大神文章
【1】Base64编码出现换行符
【2】postgresql----唯一索引,表达式索引,部分索引
【3】invalid byte sequence for encoding "UTF8": 0xe99d2c
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!