MySQL字符集不一致的解决办法总结
2007-09-06 17:16
344 查看
这阵子忙着把数据库从MS SQL数据库改成MySQL数据库,简直过着非人的生活!
再怎么忙,还是想做做笔记,绝不允许自己把一个错误重犯二次。OK,言归正传。。。
SQL:
SELECT faqname, faqparent, phrase.text AS title
FROM faq AS faq
INNER JOIN phrase AS phrase ON
(phrase.phrasetypeid = 7000 AND phrase.varname = faq.faqname)
WHERE phrase.languageid IN(-1, 0, 1)
AND (
faqparent IN('vb_custom_status', 'vb_update_profile',
'vb_calendar_how', 'vb_referrals_explain',
'vb_sig_explain', 'vb_user_maintain')
OR
faqname IN('vb_custom_status', 'vb_update_profile',
'vb_calendar_how', 'vb_referrals_explain',
'vb_sig_explain', 'vb_user_maintain')
)
mysql 错误: Illegal mix of collations (latin1_bin,IMPLICIT) and (latin1_swedish_
ci,IMPLICIT) for operation '='
mysql 错误号: 1267
从我自己的cnblogs(http://www.cnblogs.com/xugang/articles/882943.html)中看了看错误提示:)
1267:不合法的混合字符集。
总结:
错误是在你的结果集中有两种字符集。
比如说你在两个表联合查询,一个表的字符集是latin1,另一个是utf8,
这样在你的结果集中有两种字符集,mysql会报上面的错误。
一个表中不同的字段使用不同的字符集,也是一个道理。
用SHOW CREATE TABLE table_name;可以看出具体的字符集设置。
查了帮助手册,说是user的字符集没有设,默认为utf8,将其转为latin1或gb2312等字符集
解决方法:
将不同的字符集,转化成统一的字符集。
After an upgrade to MySQL 4.1, the statement fails:
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
ERROR 1267 (HY000): Illegal mix of collations
(utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
for operation 'substr_index'
The reason this occurs is that usernames are stored using UTF8 (see section 11.6 UTF8 for Metadata). As a result, the USER() function and the literal string '@' have different character sets (and thus different collations):
mysql> SELECT COLLATION(USER()), COLLATION('@');
+-------------------+-------------------+
| COLLATION(USER()) | COLLATION('@') |
+-------------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-------------------+-------------------+
One way to deal with this is to tell MySQL to interpret the literal string as utf8:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);
+------------------------------------+
| SUBSTRING_INDEX(USER(),_utf8'@',1) |
+------------------------------------+
| root |
+------------------------------------+
Another way is to change the connection character set and collation to utf8. You can do that with SET NAMES 'utf8' or by setting the character_set_connection and collation_connection system variables directly.
表的编码转换可以用:(MySQL Version > 4.12)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
之前的版本可以用:
ALTER TABLE tbl_name CHARACTER SET charset_name;
MySQL官方解释:
http://dev.mysql.com/doc/refman/5.0/en/charset-collation-charset.html
附加:
修改字段类型的方法:(经过 google 搜索)
登录MYSQL后执行这个语句就可以了:
ALTER TABLE `phrase` CHANGE `varname` `varname` VARCHAR( 250 ) NOT NULL;
修改字段字符集的方法:
mysql〉show full columns from table就會發現兩個字段的字符集是不一樣的。
通過用
ALTER TABLE `tname` CHANGE `column` `column` VARCHAR( 15 ) CHARACTER SET latin1 NOT NULL。
(假設變更為字符型,並且字符集類別為latin1 latin1 )
修改.ini文件的方法:(不建议使用)
在mysql 的安装目录下有一个my.ini文件,
打开找到[mysql]下的default-character-set=*****,改成default-character-set=gb2312,重启mysql 即可。
再怎么忙,还是想做做笔记,绝不允许自己把一个错误重犯二次。OK,言归正传。。。
SQL:
SELECT faqname, faqparent, phrase.text AS title
FROM faq AS faq
INNER JOIN phrase AS phrase ON
(phrase.phrasetypeid = 7000 AND phrase.varname = faq.faqname)
WHERE phrase.languageid IN(-1, 0, 1)
AND (
faqparent IN('vb_custom_status', 'vb_update_profile',
'vb_calendar_how', 'vb_referrals_explain',
'vb_sig_explain', 'vb_user_maintain')
OR
faqname IN('vb_custom_status', 'vb_update_profile',
'vb_calendar_how', 'vb_referrals_explain',
'vb_sig_explain', 'vb_user_maintain')
)
mysql 错误: Illegal mix of collations (latin1_bin,IMPLICIT) and (latin1_swedish_
ci,IMPLICIT) for operation '='
mysql 错误号: 1267
从我自己的cnblogs(http://www.cnblogs.com/xugang/articles/882943.html)中看了看错误提示:)
1267:不合法的混合字符集。
总结:
错误是在你的结果集中有两种字符集。
比如说你在两个表联合查询,一个表的字符集是latin1,另一个是utf8,
这样在你的结果集中有两种字符集,mysql会报上面的错误。
一个表中不同的字段使用不同的字符集,也是一个道理。
用SHOW CREATE TABLE table_name;可以看出具体的字符集设置。
查了帮助手册,说是user的字符集没有设,默认为utf8,将其转为latin1或gb2312等字符集
解决方法:
将不同的字符集,转化成统一的字符集。
After an upgrade to MySQL 4.1, the statement fails:
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);
ERROR 1267 (HY000): Illegal mix of collations
(utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
for operation 'substr_index'
The reason this occurs is that usernames are stored using UTF8 (see section 11.6 UTF8 for Metadata). As a result, the USER() function and the literal string '@' have different character sets (and thus different collations):
mysql> SELECT COLLATION(USER()), COLLATION('@');
+-------------------+-------------------+
| COLLATION(USER()) | COLLATION('@') |
+-------------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-------------------+-------------------+
One way to deal with this is to tell MySQL to interpret the literal string as utf8:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);
+------------------------------------+
| SUBSTRING_INDEX(USER(),_utf8'@',1) |
+------------------------------------+
| root |
+------------------------------------+
Another way is to change the connection character set and collation to utf8. You can do that with SET NAMES 'utf8' or by setting the character_set_connection and collation_connection system variables directly.
表的编码转换可以用:(MySQL Version > 4.12)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
之前的版本可以用:
ALTER TABLE tbl_name CHARACTER SET charset_name;
MySQL官方解释:
http://dev.mysql.com/doc/refman/5.0/en/charset-collation-charset.html
附加:
修改字段类型的方法:(经过 google 搜索)
登录MYSQL后执行这个语句就可以了:
ALTER TABLE `phrase` CHANGE `varname` `varname` VARCHAR( 250 ) NOT NULL;
修改字段字符集的方法:
mysql〉show full columns from table就會發現兩個字段的字符集是不一樣的。
通過用
ALTER TABLE `tname` CHANGE `column` `column` VARCHAR( 15 ) CHARACTER SET latin1 NOT NULL。
(假設變更為字符型,並且字符集類別為latin1 latin1 )
修改.ini文件的方法:(不建议使用)
在mysql 的安装目录下有一个my.ini文件,
打开找到[mysql]下的default-character-set=*****,改成default-character-set=gb2312,重启mysql 即可。
相关文章推荐
- mysql中文乱码,无法插入中文的解决办法总结
- Mysql文件太大导入失败解决办法总结
- mysql 不能插入中文的解决办法,修改mysql的字符集,操作见蓝色字体部分.doc
- MySQL字符集编码设置与PHP显示乱码的解决办法
- mysql 不能插入中文的解决办法,修改mysql的字符集,操作见蓝色字体部分
- mysql中文乱码,无法插入中文的解决办法总结
- linux 编译安装php及编译安装mysql常见错误总结及解决办法
- PHP MySQL字符集 乱码问题解决办法
- Mysql字符集乱码多种解决办法
- mysql启动提示 access denied for user root@localhost(using password:YES) 解决办法总结
- mysql Access denied for user \'root\'@\'localhost\'”解决办法总结
- JDBC连接MySQL字符集错误解决办法
- Navicat的1045mysql Access denied for user \'root\'@\'localhost\'”解决办法总结
- mysql创建视图时字符集问题的解决办法
- 数据库 MySQL中文乱码解决办法总结
- 关于MYSQL在UTF-8字符集下乱码的解决办法
- 为解决MySQL中 ‘鼠’能匹配出‘缩’‘弱’‘日’‘试’等字 查看的文章--mysql字符集调整的个人总结
- Mysql 字符集老改不了的解决办法
- HTML页面设置的字符集会影响发送到MySQL的字符集,所以当数据库字符集为utf8时,HTML页面也要设置字符集为utf8,中文乱码的一种解决办法
- mysql 不能插入中文的解决办法,修改mysql的字符集,操作见蓝色字体部分