着重基础之—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. VB6 如何创建一个标准控制台程序

    打开 VB6 并新建一个标准EXE程序,把窗口删掉,然后再加入一个模块. 在模块中加入AllocConsole.FreeConsole.SetConsoleTitle.Sleep的API声明: Pub ...

  2. sendkeys

    1)为了指定单一键盘字符,必须按字符本身的键.例如,为了表示字母 A,可以用 "A" 作为 string.为了表示多个字符,就必须在字符后面直接加上另一个字符.例如,要表示 A.B ...

  3. vue 项目部署后 刷新一下 页面找不到 解决

    1.修改配置router的参数  (效果不好) 2. (不能解决 出现403) 后端配置例子 Apache <IfModule mod_rewrite.c> RewriteEngine O ...

  4. win10关闭后台应用程序进程的方法

    一)win10系统后台应用有两大特点: 1.win10系统有许多系统自带应用软件,在系统任务栏中看不到任何自带的应用程序运行 2.但通过任务管理器的进程中,可直观的看到许多非系统进程正在运行. 二)后 ...

  5. git仓库搬家

    1). 从原地址克隆一份裸版本库 git clone --bare git://xxxxx.com/xxx.git 2). 然后到新的 Git 服务器上创建一个新项目 3). 以镜像推送的方式上传代码 ...

  6. Python合并列表,append()、extend()、+、+=

    在实际应用中涉及到了列表合并的问题. 在应用append()时,发现列表是以一个元素的形式追加到列表上的,最后查询后用的是extend()方法,下面是区别   1.append()  向列表尾部追加一 ...

  7. struts2标签类别

    要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts ...

  8. BeanFactory 和 ApplicationContext的区别

    今天在网上查资料无意中看到这一行代码 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext ...

  9. input radio 与label文字对齐

    input{ vertical-align:middle; margin-bottom:2px; *margin-bottom:2px; } 原地址

  10. tf.unstack\tf.unstack

    tf.unstack 原型: unstack( value, num=None, axis=0, name='unstack' ) 官方解释:https://tensorflow.google.cn/ ...