关于C#ASP.net)存取MySQL LongText字段的心得

1.LongText字段是MySQL用于存储超长字符串的数据库类型,有点类似MSSQL的memo。

2.Connector/NET读取LongText的内部实现过程:

1)  Connector/NET内部将LongText看作字符串,对外以字符串的方式进行读写,不运行调用getBytes的方法。

2)  根据MySQL的配置信息,获得MySQL的字符集,并根据字符集信息生成System.Text.Encode对象

3)  以byte[]的方式从MySQL数据库里将LongText字段信息读取出

4)  使用System.Text.Encode的GetString方法对字符串进行解码,并返回给用户

3.Connector/NET写LongText的内部实现(猜测,没有看过代码)

1)  根据MySQL的配置信息,获得MySQL的字符集,并根据字符集信息生成System.Text.Encode对象

2)  System.Text.Encode对象的GetBytes方法对字符串进行编码,转换为byte[]

3)  将byte[]以二进制流的方式写入数据库对应的LongText字段

4.Connector/NET对MySQL数据库默认的字符集

1)  MySQL 4.1以前的版本(这里特指MySQL 4.0),如果字符集是latin1(拉丁文),则.net 内部的System.Text.Encode对象为Latin1Encoding(.net内部私有对象)。CodePage=28591(EncodingName = Western European (ISO))

2)  MySQL 4.1 的版本,如果字符集是latin1,则内部的System.Text.Encode对象为CodePageEncoding。CodePage=1252(EncodingName = Western European (Windows))

3)  如果是MySQL的字符集定义为GB2312,或者UTF8(MySQL 4.0不支持),.net内部的编码方式则会根据MySQL的字符集确定。

5.Connector/NET读取MySQL的LongText字段时产生乱码的原因

Connector/NET内部将LongText字段看作字符串,而LongText字段在存取得时候,内部是按照byte[]方式进行处理的,因此,在存储LongText字段的时候,需要对传入的LongText支点的字符串(.net字符串,其内部采用unicode方式编码)进行编码,并将得到的byte[]存储到数据库里。相反,读取LongText字段的时候,需要将从数据库里读出的byte[]进行解码,还原为.net字符串。

在这个编码/解码的过程中,需要指定byte[]的编码类型(字符集类型)。字符集类型可以从MySQL获得。MySQL在安装的时候,将字符集默认为latin1。(MSSQL则会在安装的时候检查操作系统的字符集设置,并将字符集设置与当前操作系统一致)因此Connector/NET组件在存取LongText字段的时候,就会将字符串按照latin1字符集的方式进行处理,凡是出现中文的地方,都会因为字符集编码不一致,而用错误的字符串替换。而如果MySQL被其它程序按照当前用户字符集方式编码(中文的GB2312)写入,在MySQL读取的时候,也就会出现解码错误,得到乱码。

总之一句话,因为MySQL的字符集设置错误就会造成Connector/NET存取的时候出现乱码。

6.如何从MySQL 4.0数据库读取LongText信息(非MySQL定义字符集信息)

这里假设原来存储到MySQL数据的时候是按照GB2312方式存储,并且当前系统默认得字符集也是GB2312,MySQL的字符集未修改为latin1。

  byte[] buf = new byte[1024 * 10];//   向按照错误的字符集读取字符串string s= dr.GetString(0);//   按照错误的字符集,将字符串还原为byte数组
System.Text.Encoding.GetEncoding(28591).GetBytes(s, 0, s.Length, buf, 0);//   重新按照正确的字符集生成字符串
s=System.Text.Encoding.Default.GetString(buf);

7.如何种MySQL 4.1数据库读取LongText信息(非MySQL定义字符集信息)

代码和上面的一样,所不同的只是将28591替换为1252

8.如何将字符串写入LongText里(非MySQL定义字符集信息)

首先,如果通过以往的写字符方法写数据库的话,字符串里非英文字符会因为错误的编码(默认的latin1)而丢失(如果MySQL的字符集是GB2312或者UTF8则不会出现该问题),这样无论后面我们如何正确的解码,都不可能得到正确的字符串。所以,如果要写入非英文字符的字符串,就不能走正常的路线,而需要把LongText看作二进制字段,以bit流方式写入。写入方式和blob字段写入方式一样,详细方法参考bruse的文章。

MySql.Data.MySqlClient.MySqlCommand cmm = null;cmm = new MySql.Data.MySqlClient.MySqlCommand("insert into test(name) values(?name)", connect);//   以将该字段看作二进制流MySql.Data.MySqlClient.MySqlParameter param = null;param = new MySql.Data.MySqlClient.MySqlParameter("?name", System.Data.DbType.Binary);//   对输入的字符串使用GB2312进行编码param.Value = System.Text.Encoding.Default.GetBytes("aa中文测试");cmm.Parameters.Add(param);cmm.ExecuteNonQuery();

  

9.以UTF-8、UTF16(Unicode)、BigUnicode的方式将字符串写入LongText里

基本方法同“7.如何将字符串写入LongText”,不同之处在于编码方式由Default改为UTF8、Unicode、BigUnicode。

10.如何兼容MySQL 4.0、4.1的读取方法(读取UTF-16)

读取LongText的关键在于如何将LongText得到的字符串解码为byte数组,并重新编码。而Connector/NET控件在两个MySQL版本之间,对默认的编码采用了两种不同的编码/解码方式,从而导致乱码,解决的方案有:

1)  修改Connector/NET控件,提供一个获得当前Connector/NET控件(MySQL)的字符集的方法。

2)  修改Connector/NET控件,对MySQL所有版本的默认字符集都采用统一的解码方式,即如果字符集为latin1将统一采用CodePage=28591或者CodePage=1252的方式进行解码。(缺点:如果MySQL的字符集改变,则读取代码在创建System.Text.Encode对象也需要改变)

3)  修改应用程序,针对2个不同版本的MySQL数据库采用2套解决方案(缺点同2。而且需要修改的地方更多)。

4)  在MySQL连接字符串里确定字符集(在连接字符串里添加charset=gb2312),并修改程序,按照gb2312的方式还原编码(推荐使用)

p.s.

1.Connector/NET是一个.net访问MySQL的组件,本文使用的版本是1.0.0.7,MySQL使用的版本是4.0 和 4.1。.net版本1.1

2.本文针对LongText采用如此特殊的字符集编码转换过程,是因为其它应用往MySQL数据库里写数据的时候是按照UTF-16(Unicode或BigUnicode)进行编码的,MySQL4.0和4.1都不直接支持UTF-16的字符集。

3.如果只有一个应用访问MySQL数据库,可直接将MySQL的字符集改为GB2312或者UTF-8,不需按照本文这种婉转的编码方式进行字符集转换。

转载于:https://www.cnblogs.com/tom-zhu/archive/2013/04/24/3039458.html

关于C#(ASP.net)存取MySQL LongText字段的心得[转]相关推荐

  1. MySQL Longtext字段优化记录(一)

    工作中遇到一个查询很慢的情况,环境如下: 开发语言:JAVA 数据库:MySQL 数据量:1600~1800 问题:查询200条时就很慢,是慢在IO上: 如果是查全部(一千六百多条),就更慢了,几乎四 ...

  2. mysql sql in or 替换_sql IN 的用法一例--替换 mysql longtext字段中某些内容的用法

    之前给改版的一个学校里的站点突然提出要求,说需要将之前编辑的文章的字体大小全部改成默认值. 字体的控制无非有两种,一是font-size = 16 px:然后是.但是,之前发布的文章,文字的控制是由编 ...

  3. Mybatis实现存取Mysql的Json字段映射Java对象

    Mybatis实现存取Mysql的Json字段映射Java对象 一.需求 二.解决方案 一.需求 在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信 ...

  4. MySQL中字段类型为longtext的值导出后显示二进制串

    MySQL中字段类型为 longtext 的字段值保存的是Blob (Binary large objects),所以在导出sql或者将sql查询导出为其他格式的数据时,需要提前将字段类型转换一下,转 ...

  5. mysql longtext 与text_mysql longtext

    关于 mysql longtext的搜索结果 问题 mysql的varchar和longtext的选择 如果用于存储比较长文本,几千到一万左右的,用varchar还是longtext据说MySQL5的 ...

  6. php获取longtext字段为空,php – 在longtext字段上准备好的mysqli select语句将返回空...

    我有一个运行良好的数据库查询功能 – 除了我遇到了 mysqli预处理语句和longtext字段显然已知的问题.即使通过phpMyAdmin运行查询工作正常,longtext字段总是空的,会发生什么. ...

  7. sqoop 导入mysql blob字段,Sqoop导入的数据格式问题

    Sqoop简单介绍 Sqoop是用来在Hadoop平台和其他结构性存储(比如关系型数据库)之间解决大量数据传输问题的工具.也就是说可以从Oracle,MySQL,PostgreSQL等数据库中将数据传 ...

  8. mysql二进制大文件_Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)...

    <Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)>要点: 本文介绍了Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可 ...

  9. MySql中json类型的使用___mybatis存取mysql中的json

    MySql中json类型的使用 MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型.也方便了广大开发人员.但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少 ...

最新文章

  1. 从键盘输入一行字符,写入到string.txt文本文件中
  2. windows phone发布时其他注意事项
  3. 详解DNS的常用记录(上):DNS系列之二
  4. 3分钟了解带参数的main函数
  5. Daily tips-7月
  6. 基于mycat高可用方案——数据库负载
  7. bootstrap table 主子表 局部数据刷新(刷新子表)
  8. 微软发布首版基于 Chromium 79 的 Edge 浏览器
  9. 【图像分割】基于matlab GUI多种阈值图像分割(带面板)【含Matlab源码 733期】
  10. 如何发布ArcGIS Server离线地图(google 瓦片)
  11. 利用HTML简单语句来制作个人简历
  12. html扑克牌展开,HTML5 canvas扑克牌花式洗牌动画
  13. bind mysql web_bind智能DNS + bindUI管理系统(mysql + bind dlz)
  14. 通用计算机含义,当今的计算机其通用的名称应该是通用数字计算机,请简单描述包含的三层含义? (8.0分)...
  15. 时间序列预测的评估指标补遗
  16. 数据库(笔记)——关系代数以及相关运算
  17. 谭浩强c语言不讲位运算呢,谭浩强C语言教程第十二章-位运算.doc
  18. 某宝上关于PMP低价续证,可信吗?
  19. 51单片机的智能窗帘设计
  20. Java IO流和装饰模式(Decorator)

热门文章

  1. 建站之前做好规划方案会为网站带来意外之喜
  2. 企业网站外链发布有技巧
  3. 2048c语言程序,C语言实现2048小游戏
  4. jsonp数据库拿数据到html页面,前端如何优雅的使用jsonp获取接口数据
  5. sata接口_接口不同有啥区别?M.2和SATA接口SSD该选哪种?
  6. python在函数内部有没有办法定义全局变量_修改函数内部的全局变量
  7. 局部敏感哈希算法(Locality Sensitive Hashing)
  8. dns tunnel工具地址
  9. docker hub下载慢解决方法 使用daocloud的mirror
  10. 悟空分词的搜索和排序源码分析之——搜索