Tee*_*sej 8 mysql collation phpmyadmin
我正在使用MySQL数据库服务器运行生产应用程序.我忘记将列的排序规则设置latin为utf8_unicode,这会在保存到具有多语言数据的列时导致奇怪的数据.
我的问题是,如果我现在将校对更改为utf8_unicode,我的现有数据会发生什么?它会破坏或破坏现有数据还是数据仍然存在,但新数据将保存为utf8应有的数据?
我将使用phpMyAdmin Web客户端进行更改.
文章http://mysqldump.azundris.com/archives/60-Handling-character-sets.html详细讨论了这一点,并展示了将会发生的事情.
请注意,您正在将CHARACTER SET(实际上是编码)与COLLATION混合.
字符集定义磁盘上字符串的物理表示形式.您可以使用HEX()函数使其可见,例如SELECT HEX(str) FROM t WHERE id = 1,查看MySQL如何存储字符串的字节.MySQL提供给您的内容可能会有所不同,具体取决于您定义的连接的字符集SET NAMES .....
排序规则是排序顺序.它取决于字符集.例如,您的数据可能是latin1字符集,但可以根据两个德语排序顺序latin1_german1_ci或latin1_german2_ci中的任何一个进行排序.根据您的选择,诸如ö的元音将按oe或o排序.
更改字符集时,需要重写表中的数据.MySQL将读取表中的所有数据和所有索引,制作临时占用磁盘空间的表的隐藏副本,然后将旧表移动到隐藏位置,将隐藏表移动到位,然后删除旧数据,释放磁盘空间.在中间的一段时间内,你需要两倍的存储空间.
更改排序规则时,数据的排序顺序会更改,但不会更改数据本身.如果要更改的列不是索引的一部分,除了重写frm文件之外不需要做任何事情,并且MySQL的最新版本不应该做更多.
当您更改作为索引一部分的列的排序规则时,需要重写索引,因为索引是表的排序摘录.这将再次触发上面概述的ALTER TABLE表复制逻辑.
MySQL尝试保留这样做的数据:只要您拥有的数据可以在目标字符集中表示,转换就不会有损.如果正在进行数据截断,将打印警告,并且目标字符集中无法表示的数据将替换为?
小智 6
在将VARCHAR列设置为MySQL的MySQL 5.1中运行快速测试,latin1_bin插入了一些非拉丁字符
INSERT INTO Test VALUES ('????');
Run Code Online (Sandbox Code Playgroud)
我选择它们并得到垃圾(如预期)。
SELECT text from Test;
Run Code Online (Sandbox Code Playgroud)
给
text
????
Run Code Online (Sandbox Code Playgroud)
然后,我将列的排序规则更改为,utf8_unicode然后重新运行SELECT,它显示出相同的结果
text
????
Run Code Online (Sandbox Code Playgroud)
这就是我所期望的-它会保留数据,并且数据将保持垃圾状态,因为在插入数据时,列丢失了额外的字符信息,而只是插入了?。每个非拉丁字符,没有办法使用???? 再次成为????。
您的数据将保留在原处,但不会被修复。