Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1833070
  • 博文数量: 117
  • 博客积分: 2559
  • 博客等级: 少校
  • 技术积分: 4385
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-13 20:08
个人简介

作为初学者,要想取得进步,成为高手,首先应该了解自己的不足之处.

文章分类

全部博文(117)

文章存档

2014年(1)

2013年(25)

2012年(13)

2011年(77)

2010年(1)

分类: Mysql/postgreSQL

2011-04-19 14:58:34

ERROR 1267(HY000):Illegal mix of collations

类似上面的错误,则为字符集问题

 

可查看原理部分,如果我用程序插入字符集为utf8的字符,要在mysql客户端正常显示,则需要把character_set_results设置为utf8格式

例如

mysql> show variables like 'character%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | latin1                     | 客户端字符集

| character_set_connection | latin1                     | 客户端与服务器端连接采用的字符集

| character_set_database   | utf8                       | 数据库采用的字符集

| character_set_filesystem | binary                     |

| character_set_results    | latin1                     | SELECT查询返回数据的字符集

| character_set_server     | utf8                       |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)

 

字符集的设置

可以在my.cnf中设置:

[mysqld]

default-character-set=gbk

或者在启动选项中指定:

mysqld --default-character-set=gbk

或者在编译的时候指定:

./configure --with-charset=gbk

 

原理解析:

 

MySQL存储数据的唯一地方就是列,所以继承的较高层次只有默认值。表的默认字符集不会影响到表里面存储的数据,它只是告诉MySQL在创建列的时候如果没有指定字符集,那么就使用该默认值

在显式地定义字符集的时候,并不需要同时定义字符集和排序规则。

 

只有基于字符的值才有字符集

其他的任何东西都只是规定使用何种字符集来进行比较或其他操作

基于字符的值可以是存储在列中的值、查询中使用的字面常量、表达式的结果、用户变量等。

 

MySQL的设置分为下面两类:

  1. 创建对象时的默认设置

当创建一个数据库的时候,它从服务器继承了character_set_server

当创建表的时候,它从数据库继承字符集

当创建列的时候,它从表继承字符集

 

  1. 用于客户端/服务器沟通的设置
    1. 服务器假设客户端正在按照character_set_client设置的字符集发送数据
    2. 服务器从客户端收到语句后,它按照character_set_connection设置的字符集对数据进行翻译,它也会用这个字符集决定如何把数字转换为字符串。
    1. 当服务器把结果或错误信息返回客户端时,它会按照character_set_result定义的字符集进行翻译。

 

使用set names命令,set names实际上就是同时设置了 character_set_client character_set_connection character_set_results

或者set character set命令按照自己的需要改变上面的3个设置。

但是,这两个命令只会影响服务器的设置。客户端程序和API也需要正确地进行设置,以避免和服务器的沟通问题

 

 

注意:

character_set_database的默认值是默认数据库的值。当改变默认数据库的时候,它也会跟着改变。如果没有默认数据库,它的默认值就是character_set_server

LOAD DATA INFILE按照当前character_set_database的设置解释接收到的数据。

阅读(7115) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~