请教关于MySQL字符串
大家好,想请教关于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。
谢谢大家!