我有段表定义语句,像这样的:
DROP TABLE IF EXISTS `aa`;
CREATE TABLE `aa` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8 NOT NULL,
  `password` varchar(20) CHARACTER SET utf8 NOT NULL,
  `limit` int(11) NOT NULL DEFAULT '7',
  `showname` varchar(40) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=gb2312;字段里的CHARACTER SET utf8与末尾的CHARSET=gb2312是什么关系?我疑虑就在于:
如果我像这个表里插入记录,我到底是应该以utf-8还是gb2312编码格式插入?

解决方案 »

  1.   

    utf-8
    注意utf-8又分为二种即uncoide与e
    你要坚持做到三个一致啊。
      

  2.   

    ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=gb2312;这个是表的默认字符集。
    `username` varchar(20) CHARACTER SET utf8 NOT NULL,
    这个是字段的字符集设置。
      

  3.   

    应该是UTF8,建议字符集设置为统一
      

  4.   

    关于三个字符集参数的关系参见下贴。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/12/4174186.aspx
    MySQL 中文显示乱码
      

  5.   


    也就是说,CHARSET=gb2312是表的全局设置,当字段没有设置字符集时就用这个,如果设置了,就按字段设置为准.可以这样理解吗?
      

  6.   

    mysql编码分为服务端编码和客户端编码两大类
    字段编码, 表编码, 数据库编码这些编码都属于服务端编码,服务端编码决定你可以存哪些字符以及这些字符要哪种规则排序.字段编码优先级最高. 你插入用什么码属于客户端编码, 你用什么客户端编码都无所谓,只要插入前加个命令set names xxx 就可以了,mysql都会给你转换,你考虑只是客户端编码和服务端编码大小集问题,是否存在映射.(比如服务端编码为GB2312, 客户端编码为BIG5, mysql肯定转换不了)
    如果要正常显示字符,客户端编码xxx要和你应用程序的环境编码相同, 否则会无法正常显示(出现乱码), 这是mysql新用户最大的困扰.
      

  7.   


    你所说的mysql都会去转换是什么意思?比如我客户端set names 'utf8',表编码为gb2312,这样是不会被正确转换的吧?
      

  8.   

    他会转换啊, 但如果字符无法映射, 他也转换不了, 只能用?代替或省略, 如客户端utf8中的繁体字, 是存不到编码为gb2312的字段里.set names xxx 好比告诉mysql服务器: "我这边的编码为xxx, 请帮忙帮我转换一下编码"
    所以set names xxx很重要, 你不能选错, 一定要和你应用程序的字符环境相同. 
      

  9.   

    字段里的CHARACTER SET utf8与末尾的CHARSET=gb2312是什么关系?
      `username` varchar(20) CHARACTER SET utf8 NOT NULL,
      `password` varchar(20) CHARACTER SET utf8 NOT NULL,
      `limit` int(11) NOT NULL DEFAULT '7',
      `showname` varchar(40) CHARACTER SET utf8 NOT NULL
    表中字段默认字符集是CHARACTER SET utf8而character=gb2312是表的字符集我疑虑就在于:
    如果我像这个表里插入记录,我到底是应该以utf-8还是gb2312编码格式插入?
    应该是utf8