解决方案 »

  1.   

    char(64),编码是UTF8的。则可以保存 64 个汉字。
    至少工具中没有实现,应该是字符集设置上有问题。按下贴中方法检查字符集设置。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  2.   

    mysql的char和varchar保存的是字符数 不是字节数
      

  3.   

    感谢两位的回答。已经弄明白了。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在数据库服务中完成。