请教关于MySQL字符串

eastcowboy 2013-11-26 04:35:38
大家好,想请教关于MySQL字符串的两个问题。

1、关于字符串的容量。
我建立的表,有一列的类型设置为char(64),编码是UTF8的。
本来以为这一列可以容纳21个汉字(因为汉字在UTF8编码中一般占3字节,64/3 = 21),用navicat测试也确实如此。复制30个汉字到这一列,字符串被截断,实际保存了21个汉字。
但是最近学习C#, ASP.NET,发现这一列其实可以保存64个汉字!利用C#构造insert语句,把70个汉字写入到这一列,字符串被截断,实际保存了64个汉字。
想问问这是怎么一回事?char(64)是固定长度,而UTF8编码中,每个字符所占的字节数又是可变的,不知道MySQL是怎么做到可以保存64个汉字的呢?如果用这一列来保存64个英文字符,是不是就有点浪费了?

2、关于字符串的编码。
我们先前的项目是C++的,在MySQL建立数据库时选择UTF8编码,之后所有可以选择编码的地方全部都选择UTF8。看起来一切正常,不论C++程序还是navicat都能正确识别,没有乱码。
但现在新的项目用ASP.NET,C#,应该确定把所有可以设置编码的地方都设置为UTF8了。列举如下:
2.1 - 连接串:server=localhost;port=3306;database=card_game;user=root;password=;pooling=true;charset=utf8
2.2 - 数据库连接成功后首先执行:set names utf8
2.3 - asp网页写上:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestMySQL.aspx.cs" Inherits="TestAspServer.TestMySQL" CodePage="65001" %>
2.4 - Page_Load事件中写上:Response.Charset = "UTF-8";
似乎也没有其它地方遗漏,但还是会乱码。
由navicat或者原先C++项目写入数据库的话,C#读取得到的就是乱码。
反之,C#写入数据库的话,navicat或者C++项目读取得到的也是乱码。
不知道应该如何解决?或者说,是不是navicat以及之前的C++项目是错误的,C#才正确?毕竟它更有效的利用了字符串存储空间。

其它基本配置:
MySQL版本:mysql Ver 14.14 Distrib 5.6.10, for Win32 (x86)
MySQL Connector /net版本:6.7.4.0,下载的时候选择的不是msi的安装包,而是选择.NET/Mono平台的绿色版dll,不知道是否影响。
MySQL本身配置的默认编码是latin1,但建立数据库时选择的是UTF8。其它凡是遇到可以选择编码的地方全都选择UTF8。

谢谢大家!
...全文
165 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mysticc 2014-03-25
  • 打赏
  • 举报
回复
不错的贴子,刚好解决了我的问题
eastcowboy 2013-11-28
  • 打赏
  • 举报
回复
感谢两位的回答。已经弄明白了。 1、关于程序和容量。 一个字符算一个char,所以char(64)其实是可以保存64个汉字的。 在我们先前的项目中,没有设置字符集,通过调试发现默认是latin1。而我们实际insert到数据库时,用的是UTF8编码,一个汉字占三个字节。 在保存数据时,数据库收到UTF8编码的字符串之后,把每个汉字(三个字节)当作三个latin1编码的字符保存。 在读取数据时,程序收到latin1编码的字符后,每三个字符当作三个字节,解析成一个UTF8编码的汉字。 这样看起来也没有乱码,但浪费了三倍的存储空间。 后来我们新项目用C#去访问先前的数据库,看起来乱码了,但其实这才是正确的。按照我在顶楼那些设置,已经可以正确了。 2、关于navicat工具。 在我们先前的项目中,navicat工具选项被强制设置为UTF8编码。其实这跟先前程序的错误是一样的。 在保存数据时,数据库收到UTF8编码的字符串之后,把每个汉字(三个字节)当作三个latin1编码的字符保存。 在读取数据时,程序收到latin1编码的字符后,每三个字符当作三个字节,解析成一个UTF8编码的汉字。 为解决这个问题,只要在“连接属性”中,不要强制设置编码,勾上“使用MySQL字符集”即可。 区别很明显。 如果强制设置编码,则show variables like 'char%'显示为latin1,转码的动作是由navicat在客户端完成。 而设置“使用MySQL字符集”,则show variables like 'char%'显示为utf8,转码的动作是由MySQL在数据库服务中完成。
rucypli 2013-11-26
  • 打赏
  • 举报
回复
mysql的char和varchar保存的是字符数 不是字节数
ACMAIN_CHM 2013-11-26
  • 打赏
  • 举报
回复
char(64),编码是UTF8的。 则可以保存 64 个汉字。 至少工具中没有实现,应该是字符集设置上有问题。按下贴中方法检查字符集设置。 http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx MySQL 中文显示乱码

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧