着重基础之—MySql Blob类型和Text类型
着重基础之—MySql Blob类型和Text类型
在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固。
最近做的项目中,提供给接口调用方数据同步接口,传输的数据格式是Json串。由于json串的结构层级较多,数据量也不少。在设计数据库的时候,选择了Blob类型做为字段类型。一切的一切就打这开始,同步服务正常运作,但是问题慢慢的暴露了出来,客户端在暂时我所提供的数据的时候,中文总是显示乱码,乱码,乱码,一直乱码。
问题的分析路径
1.查看了数据库连接字符串,characterEncoding=utf8 ,配置正常。
2.询问接口调用方,编码格式一致,utf8。
3.查看数据库编码格式,utf8,正常。
4.查看数据表编码格式,utf8,正常。
然后问题依然存在,中文数据通过查询脚本查出来的结果都显示正常,但是一到网页上依然是乱码,乱码。于是把线上的数据导出到本地一份,接着观察,发现中文乱码处可以看出,一个中文被3个字节所代替,考虑到utf8编码格式下,一个中文占3个字节,问题的原因初步可以断定是数据的存储格类型引起的。然后查阅了Mysql Blob 类型的说明,Blob存储的其实是二进制数据,我们来看看Blob的定义:
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。BLOB 列被视为二进制字符串(字节字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。我们再来看看常用的大文本类型Text的定义,这样能有一个对比。
TEXT列被视为非二进制字符串(字符字符串),TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。
通常Mysql 字符集的配置就告诉了Mysql在执行查询时所呈现的编码格式,就拿Blob中存储的二进制数据举例来说:在mysql 控制台执行查询命令时,控制台自身就帮我们完成了由字节到文本的转换,相应地中文也进行了正常的转换。记得,此处我们强调了mysql控制台,或者说就是我们常用的shell命令,mysql -u *** -p 脚本执行的控制台环境。字节——文本的转换Mysql 控制台按照utf8的编码格式进行了转换。 这也是为什么我们登陆到mysql服务后,mysql -u *** -p 登陆mysql服务器后,执行查询脚本的到正常数据的原因。
那么为什么通过程序连接mysql返回的结果不对呢,是因为java程序连接mysql执行查询后,Blob类型本身是没有字符集的,也就不会做根据字符集的校对,所以java连接mysql执行查询返回的Byte[]字节数组是没有经过任何字符集校队的,即便你存入Blob的数据本身就是符合utf8编码格式的,最终得到的结果依然会是乱码,除非你在程序中有相应的处理逻辑。
好了,到这终于解决了中文乱码展示的问题,同时也明白了乱码出现的原因。对Blob类型的认识也更加深刻。
小提示:如果你的BLOB中存储的数据原本就是符合utf8编码格式的,同时你的数据库以及数据表的编码格式的符合utf8,那么字段类型由BLOB变更为Text类型时,数据时可是保证正常转换的,当然,别忘记了字段长度要保持一个量级。这个我自己测试了下,没有问题。
着重基础之—MySql Blob类型和Text类型的更多相关文章
- 【Mysql】Mysql Json类型或Text类型可以建索引吗?
一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql)); ERROR (): JSON column 'card_pay_data' cannot be used in key s ...
- [mysql]MySql数据类型和java类型对照表
MySQL Type Name Return value ofGetColumnClassName Returned as Java Class BIT(1) (new in MySQL-5.0) B ...
- MySql Int 类型和 varchar类型进行比较。
今天遇到个比较奇葩的问题,简单讲就是在Mysql中进行查询的时候 在Where语句中使用的int类型的字段和Varchar类型的字段进行对比. 例如:我这有一张表: 表中的数据如下: 当我进行查询的时 ...
- JS基础_数据类型-Null类型和Undefined类型
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java Blob类型和String类型相互转换
1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content ...
- 着重基础之—MySql 不能遗忘的索引操作
着重基础之—MySql 不能遗忘的索引操作 关于MySql索引的基础知识我就不在这里写了,我不太想当信息的搬运工. 技巧分享:Workbench 作为一款专为MySQL设计的ER/数据库建模工具.除了 ...
- Date类型和Long类型的相互转换
Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- MIME类型和Java类型
MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...
随机推荐
- Java工具类实现校验公民身份证的有效性
转自:https://www.oschina.net/code/snippet_1859292_39120 1 package com.tg.user.controller; import java. ...
- springboot - mybatis - 下划线与驼峰自动转换 mapUnderscoreToCamelCase
以前都是在mybatis.xml中来配置,但是spring boot不想再用xml配置文件.网上搜寻了好久,才找到设置办法:sessionFactoryBean.getObject().getConf ...
- VirtualBox“切换到无缝模式”和“自动调整显示尺寸”菜单无法使用
现象:VirtualBox“切换到无缝模式”和“自动调整显示尺寸”菜单无法使能,无法全窗口显示虚拟机桌面,菜单状态如下图所示: 原因:该功能的支持需要安装VirtualBox增强功能 方法:安装Vir ...
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
MonadCont 类型类 class Monad m => MonadCont m where callCC :: ((a -> m b) -> m a) -> m a in ...
- (2)shiro角色资源权限
一般在web系统权限设计中,一般分为三个维度,用户,角色,资源,一个用户可以拥有多个角色,比如说可以是老师,也可以是班主任,一个角色也可以拥有多个资源. 比如老师同时拥有查看班级学生和批改作业的资源, ...
- 【336】Tutorial of Endnote
Now I start to use Endnote to manage my literatures and I need to learn how to use it. Below is some ...
- java开源项目jremoting
https://github.com/jremoting/jremoting jremoting是一个类似dubbo的rpc服务治理框架,并且可以与dubbo相互调用.jremoting的实现是参考了 ...
- 01Tensorflow学习之Tensorflow基本介绍
1 tensorflow简介 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基 ...
- spring AOP 注解配置
applicationContext-resource.xml: <?xml version="1.0" encoding="UTF-8"?>< ...
- python 写hive循环脚本
要一个月的数据 一次跑一周的数据 ,建表用插入数据的方法: import os, sys reload(sys); sys.setdefaultencoding( "utf-8" ...