着重基础之—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类型时,数据时可是保证正常转换的,当然,别忘记了字段长度要保持一个量级。这个我自己测试了下,没有问题。

  

时间: 2024-10-21 07:43:32

着重基础之—MySql Blob类型和Text类型的相关文章

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

一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql> CREATE INDEX idx1 ON user (card_pay_data(10)); ERROR 3152 (42000): JSON column 'card_pay_data' cannot be used in key specification. 二.text类型 答案是可以的,但是需要指定长度 mysql> CREATE INDEX idx2 ON user (tests); ERROR 1170 (4

Mysql数据库中图片字段Blob类型和String类型相互转换

1.Blob-->String String result = ""; if (blob != null) { InputStream is = blob.getBinaryStream(); ByteArrayInputStream bais = (ByteArrayInputStream) is; byte[] byte_data = new byte[bais.available()]; // bais.available()返回此输入流的字节数 bais.read(byt

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

1.String 转 Blob: String content = "Hello World!"; Blob blob = Hibernate.createBlob(content.getBytes()); 2.Blob 转 String: Blob blob; try{ String content = new String(blob.getBytes((long)1, (int)blob.length())); } catch(SQLException e) { e.printSt

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

着重基础之—MySql 不能遗忘的索引操作 关于MySql索引的基础知识我就不在这里写了,我不太想当信息的搬运工. 技巧分享:Workbench 作为一款专为MySQL设计的ER/数据库建模工具.除了管理数据库外,其实也是一款Sql语句生成利器.合理利用,将带来事半功倍的效果.当然,前提是我们对基础知识的了解. 我先来整理一些索引操作的Sql语句,之所以整理,起因是我遇到问题时,在百度里查到的回复,基本上都是错的,需要有人来纠正. 1.多主键(PRIMARY)删除 假设场景:你在表里定义了多个主

java date类型和calendar类型区别

Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. 1.使用Date类代表当前系统时间 Date d = new Date(); System.out.println(d); 使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下: Sun Ma

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

Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 1.Date类型转Long类型 // pa

Timestame类型和String 类型的转化

Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = df.format(new Date());Timestamp ts = Timestamp.valueOf(time); Timestamp转化为String: SimpleDateFormat df = new SimpleDateFo

python3.5 的str类型和bytes类型的转换

在python3.x里增加了bytes类型,并且对str方法进行了修改,让str类型和bytes类型可以相互转换. #!/usr/bin/env python # -*- coding:utf-8 -*- a = "哈哈" #字符串转换成字节 b = bytes(a,encoding='utf-8') print(b) b1 = bytes(a,encoding='gbk') print(b1) #将字节转换成字符 c=str(b,encoding='utf-8') print(c)

MySql数据类型和Java数据类型对应一览

类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR java.lang.String 1   BLOB L+N BLOB java.lang.byte[] -4   TEXT 65535 VARCHAR java.lang.String -1               INTEGER 4 INTEGER UNSIGNED java.la