MySql支持cyrilic字母表有一个奇怪的问题。数据库从一开始就在utf8_unicode_ci中创建,但表格不是。现在表数据,如果以cyrrilic提供,看起来像这样,如果我从utf开始创建一个表没有问题,但是如果我尝试使用更改现有的表编码p>
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; collation%&#39 ;;我明白了:
我也直接在PHP中更改为utf我的管理员,它实际上显示该表是在utf但是没有任何事情发生在现有的?????????或未来的西里尔输入。
希望其他人遇到过这样的问题,对于任何帮助或建议都会非常棒。谢谢。
答案 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'
身份连接,请不要依赖root
,init-connect
和任何其他root
用户都会忽略SUPER
。
但是......你说你把西里尔文写入latin1专栏?这是“不可能的”,因为除了基于拉丁语的西欧角色之外,latin1不能代表任何其他东西。所以...你可能有“双重编码”。
有关更多调试信息,请参阅Trouble with utf8。特别注意“问号”。
要修复双重编码,请参阅Fixes,然后选择合适的案例。此链接还说明了应所做的事情(两步改动),而不是你所做的。