着重基础之—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类型的更多相关文章

  1. 【Mysql】Mysql Json类型或Text类型可以建索引吗?

    一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql)); ERROR (): JSON column 'card_pay_data' cannot be used in key s ...

  2. [mysql]MySql数据类型和java类型对照表

    MySQL Type Name Return value ofGetColumnClassName Returned as Java Class BIT(1) (new in MySQL-5.0) B ...

  3. MySql Int 类型和 varchar类型进行比较。

    今天遇到个比较奇葩的问题,简单讲就是在Mysql中进行查询的时候 在Where语句中使用的int类型的字段和Varchar类型的字段进行对比. 例如:我这有一张表: 表中的数据如下: 当我进行查询的时 ...

  4. JS基础_数据类型-Null类型和Undefined类型

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Java Blob类型和String类型相互转换

    1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content ...

  6. 着重基础之—MySql 不能遗忘的索引操作

    着重基础之—MySql 不能遗忘的索引操作 关于MySql索引的基础知识我就不在这里写了,我不太想当信息的搬运工. 技巧分享:Workbench 作为一款专为MySQL设计的ER/数据库建模工具.除了 ...

  7. Date类型和Long类型的相互转换

    Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...

  8. java中XMLGregorianCalendar类型和Date类型之间的相互转换

    import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...

  9. MIME类型和Java类型

    MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...

随机推荐

  1. 14 MySQL--事务&函数与流程控制

    一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性 场景: ...

  2. UI5-文档-4.27-Mock Server Configuration

    我们只是在一个真实的服务上运行我们的应用程序,但是对于开发和测试我们的应用程序,我们不希望依赖于“真实”服务的可用性,或者在数据服务所在的系统上增加额外的负载. 这个系统就是所谓的后端系统,我们现在将 ...

  3. Ztree学习(-)简单例子

    https://www.cnblogs.com/shinhwazt/p/5828031.html ztree包:https://pan.baidu.com/s/1vOgGm_elF-lF0VowoHw ...

  4. windows7安装node

    一.在官网下载node 二.按照提示进行安装 三.安装好的目录结构 四.测试是否安装好了node 首先按快捷键win+r,在运行窗口输入cmd,调出命令提示窗口,在命令提示窗口中输入path查看nod ...

  5. Java LinkList遍历方式

    1.LinkedList的遍历方式 a.一般的for循环(随机访问) int size = list.size(); for (int i=0; i<size; i++) { list.get( ...

  6. Linux下方便的块设备查看工具lsblk

    之前在Linux下看有什么块设备,通常都用fdisk什么的或者直接ls /dev/ 去看很不方便. 这个工具属于util-linux-ng包,在RHEL 6.1上是安装好的啦,直接用就好. ubunt ...

  7. delphi 颜色转换函数总结

    unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...

  8. dowhile

    public class TestDoWhile { /**do while 至少执行一次 先斩后奏 * 测试dowhile */ public static void main(String[] a ...

  9. linux一些基本常识(三)

    acl:对本身权限的扩展    打包:zip 111.zip a.txt b.txt.....    zip -r /etc/sysconfig/* (样才能第归所有内容0)    解宝:uzip 1 ...

  10. vcf格式简介

    1)背景 伴随着大规模的基因分型及测序工程的产生(例如1000 Genomes Project),之前的信息贮存格式例如gff文件它记录了每一个基因的详细信息,其中许多基因信息在基因组之间是共享的,而 ...