如何在不丢失或更改数据的情况下更改列排序规则?

时间:2015-03-15 23:56:29

标签: mysql sql database character-encoding collation

我一直在使用mysql版本5.5.41并遇到了一个问题。 我将表格中特定列的排序规则从latin1_swedish_ci更改为hebrew_bin,这会更改该列中的数据。例如,我在字段中插入了école,在转换时,我得到了?cole。 所以我搜索了一个解决方案并找到了this。您可以看到它声明如果不更改有关更改字符集和排序规则的数据,您必须转换为blob然后转换为所需的字符集。我也试过了,只是为了获得יcole。那么如何在不丢失数据的情况下更改列排序规则。

这些是我对blob尝试的查询: -

ALTER TABLE `something` CHANGE `name` `name` BLOB;
ALTER TABLE `something` CHANGE `name` `name` VARCHAR(12) CHARACTER SET hebrew COLLATE hebrew_bin NOT NULL;

2 个答案:

答案 0 :(得分:2)

您必须按CHANGE

更改MODIFY

第一步是将列转换为二进制数据类型,删除现有字符集信息而不执行任何字符转换:

ALTER TABLE something MODIFY name BLOB;

下一步是将列转换为具有正确字符集的非二进制数据类型:

ALTER TABLE something MODIFY name VARCHAR(12) CHARACTER SET hebrew COLLATE hebrew_bin;

或试试这个:

ALTER TABLE something MODIFY name VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_unicode_ci

阅读更多内容:

http://dev.mysql.com/doc/refman/5.5/en/charset-conversion.html

http://dev.mysql.com/doc/refman/5.5/en/charset-column.html

请注意,对列运行任何MODIFYCHANGE操作(实际上)删除列上的任何默认值或注释{{3 }}

  

使用CHANGE或MODIFY时,column_definition必须包含数据   类型和应该应用于新列的所有属性,其他   比索引属性,如PRIMARY KEY或UNIQUE。属性   出现在原始定义中但未指定为新定义   定义不会结转。

答案 1 :(得分:0)

SELECT HEX(col), col FROM ...查看“école”的内容。 Latin1看起来像E9636F6C65。如果我没弄错的话,希伯来语中没有包含'é'。有关可能支持的完整字符集,请参阅http://collation-charts.org/mysql60/mysql604.hebrew_general_ci.html

假设这是正确的,不要尝试转换为CHARACTER SET希伯来语;你会丢失信息,例如'é'被变成'?'。

如果您需要存储希伯来字符和法语重音字符(等),请使用utf8。