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

时间:2017-10-05 15:31:47

标签: mysql encoding utf

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

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 Variable_name LIKE&#39; character_set _%&#39; OR Variable_name LIKE&#39; collat​​ion%&#39 ;;我明白了:

enter image description here

我也直接在PHP中更改为utf我的管理员,它实际上显示该表是在utf但是没有任何事情发生在现有的?????????或未来的西里尔输入。

希望其他人遇到过这样的问题,对于任何帮助或建议都会非常棒。谢谢。

1 个答案:

答案 0 :(得分:0)

如果表格以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表示双重编码。一团糟。

如果您以init-connect='SET NAMES utf8'身份连接,请不要依赖rootinit-connect和任何其他root用户都会忽略SUPER

但是......你说你把西里尔文写入latin1专栏?这是“不可能的”,因为除了基于拉丁语的西欧角色之外,latin1不能代表任何其他东西。所以...你可能有“双重编码”。

有关更多调试信息,请参阅Trouble with utf8。特别注意“问号”。

要修复双重编码,请参阅Fixes,然后选择合适的案例。此链接还说明了所做的事情(两步改动),而不是你所做的。