mysql不同编码数据间的转换

首先说下mysql的文字处理过程。

客户端编码的文字=>服务器连接编码的文字=>存储编码的文字

一般前两个编码是相同的,
在客户端连接服务器的同时由客户端决定。

存储编码就是我们建表的时候通过
服务器编码,数据库编码,表编码,列编码一系列
规则确定的列的编码。

默认在客户端连接服务器时确定的前两个编码是latin1编码。
如果列的存储编码是latin1,
我们输入的是中文,
上面的三个过程都是不要编码转换的,
存进去的是什么读出来的还是什么。
但中文之间的比较是按latin1的比较规则来做的,
所以很多根本没关联的中文会被认为是一样的。

如果没有大小写不敏感的需求的话,
可以直接修改列的比较规则,
让mysql在比较的时候按二进制规则来比较。

如果有大小写敏感的需求的话,
就只有建一个新的gbk编码的表,
然后把数据导过去。

但直接在mysql 中导是不可以的。
因为两边的编码方式不一样,
所以mysql会做一次编码转换,
把latin1的文字转成gbk的。
但127以上的latin1字符在gbk中是没有的。
mysql的处理方式是没有的用一个?号来代替。
结果导完之后就只剩下一堆问好。
这不是显示问题,
而是存的就是这些问好。
所有的信息都在转换的时候丢失了。

我不知道有没有sql选项可以不让mysql进行编码转换。
我觉得应该有。
但我找了两天没找到。
没办法。只好自己动手写写程序来导。

我的做法是建立两个连接。
我把数据读出来,
将写入的连接的前两种编码设置成gbk,
然后写入。
这样在两个连接上都不会有编码转换。
逻辑是这样的,
mysql不会分析你给的是什么编码的文字,
而是相信你告诉他的编码是什么。

但是要注意。
读gbk编码的列的时候也要把客户端编码和连接编码设置成gbk。
否则读出来的还是几个问号。
不过数据库里存的是对的。


转载于:https://www.cnblogs.com/much2max/archive/2006/03/15/350956.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值