站长论坛

标题: MySQL中文字符FAQ [打印本页]

作者: tznktg    时间: 2007-9-7 23:48
标题: MySQL中文字符FAQ
1.用EMS工具建立一个表t,添加一个字段f1,varchar(20).
  然后再在EMS中为该表添加一条记录,f1的值为'adfasfsa',成功。
  但当f1的值为中文时,提示失败:数据太长。
  f1是varchar(20),怎么会数据太长呢?用mysql命令行工具:insert into t (f1) values ('我');
  提示依旧。
  
  分析:
  当前配置的character_set_client值为非中文字符集。
  在mysql的一次会话中,服务器收到客户端发来的指令后,大致要执行3个动作:
  1、服务器认为收到的指令是按当前character_set_client环境变量所指定的字符集编码的,
  2、然后再将其转换成character_set_connection所指定的字符集编码
  3、分析、执行该指令。
  
  注:如果character_set_connection所指定的字符集不是中文字符集,则插入后,记录中的的中文仍然无法正常显示。
      因为mysql服务器是按character_set_connection所指定的编码存入数据库的。
      因此。character_set_client和character_set_connection的字符集必须保持一致。
      另外,character_set_results变量所指定的字符集表示服务器向客户端传输数据时所采用的字符集
      所以配置文件中的default-character-set参数同时表示character_set_connection、character_set_client、character_set_results
  如果当前character_set_client=latin1,则在将insert into t (f1) values ('我')从latin1转换成character_set_connection所指定的编码字符集时,
  mysql发现指令中的'我'是宽字符集,不是latin1字符集,于是报告错误:"ERROR 1406 (22001): Data too long for column 'f1' at row 1"
  
  解决办法:
  1.临时方案:在mysql命令行执行命令:set character_set_client = gbk.临时将character_set_client设成gbk字符集。
  2.永久方案:
  打开/etc/my.cnf文件 找到[mysql]部分,将default-character-set=latin1改成default-character-set=gbk。
  如果没有改行,则增加之。
  default-character-set=gbk
  
2、用mysqldump工具备份数据时,备份文件中的中文无法显示:
   mysqldump -u root -p --all-databases  > backup.sql
   打开backup.sql后,发现数据部分中的中文全部是????号。
   
   此时加一个参数:--default-char-set=gbk,重新导出即可。
   mysqldump -u root -p --all-databases --default-char-set=gbk > backup.sql




欢迎光临 站长论坛 (http://www.tzlink.com/bbs/) Powered by Discuz! X3.2