MySql数据库将现有表更改为UTF8

问题描述:

MySql支持cyrilic字母表,我有一个奇怪的问题。数据库从一开始就在utf8_unicode_ci中创建,但这些表不是。现在表格数据,如果提供cyrrilic看起来像这样????????,如果我从UTF开始创建一个表是没有问题的,但是如果我尝试通过使用MySql数据库将现有表更改为UTF8

来更改现有表编码
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

这是应该改变现有的数据或

ALTER TABLE Strategies 
    CHARACTER SET utf8, 
    COLLATE utf8_unicode_ci; 

这是应该改变未来的数据,这是行不通的。

我也改变my.cnf文件和

[mysqld] 
# 
#default-character-set=utf8 this one breaks mysql restart 
character-set-server=utf8 
skip-character-set-client-handshake 
collation-server=utf8_unicode_ci 
init-connect='SET NAMES utf8' 
init_connect='SET collation_connection = utf8_general_ci' 

添加如果我运行SHOW VARIABLES WHERE变量名LIKE 'character_set_%' 或变量名LIKE '归类%';我得到:

enter image description here

我也直接在PHP我管理改为UTF,它实际上表明该表是UTF但没有任何反应现有?????????或未来的西里尔文输入。

希望别人经历过这类问题,对于任何帮助或建议都会非常有帮助。谢谢。

+0

您从information_schema获得什么... SELECT CHARACTER_SET_NAME,COLLATION_NAME。其中table_schema =''和table_name =''的列。 ? –

+0

问题中表格/列的* original *编码是什么? – Binarus

+0

它曾经是latin1_swedish_ci –

如果一个表开始为LATIN1 在已处理latin1编码的字符,请使用ALTER TABLE ... CONVERT TO CHARACTER SET utf8(像你一样)

转换之前,先测试旧编码做两件事情:

SHOW CREATE TABLE ... -- to see that the columns say latin1 
SELECT HEX(col) ... -- to see what the encoding looks like: é should show E9 

我说“之前”,因为可能会错误地将utf8塞进latin1中。 é应该显示C3A9 - 这是“双重编码”。

也这样做转换:

SHOW CREATE TABLE ... -- to see that the columns say utf8 
SELECT HEX(col) ... -- to see what the encoding looks like; é should show C3A9 

C383C2A9将表明双重编码。一团糟。

,如果你连接为rootinit-connectroot和任何其他SUPER用户忽略不依赖于init-connect='SET NAMES utf8'

但是...你说你把西里尔文文本放到latin1列中?这是“不可能的”,因为拉丁文1不能代表拉丁文西欧文字以外的任何其他文字。所以......你可能有“双重编码”。请参考Trouble with utf8。特别注意“问号”。

要修复双重编码,请参阅Fixes,然后选择相应的情况。这个链接还说你应该应该已经完成(2步改变),而不是你做了什么。