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

Mysql 如何在不丢失或更改数据的情况下更改列排序规则?,mysql,sql,database,character-encoding,collation,Mysql,Sql,Database,Character Encoding,Collation,我一直在使用mysql版本5.5.41,遇到了一个问题。 我将表中特定列的排序规则从latin1_swedish_ci更改为hebrew_bin,这将更改该列中的数据。例如,我在字段中插入了école,在转换时,我得到了?cole。 所以我寻找一个解决方案并找到了答案。您可以看到,为了不丢失更改字符集和排序规则的数据,必须先转换为blob,然后再转换为所需的字符集。我也试过了,结果得到了יcole。那么,如何在不丢失数据的情况下更改列排序规则呢 以下是我对blob尝试的疑问:- ALTER TA

我一直在使用mysql版本5.5.41,遇到了一个问题。 我将表中特定列的排序规则从latin1_swedish_ci更改为hebrew_bin,这将更改该列中的数据。例如,我在字段中插入了
école
,在转换时,我得到了
?cole
。 所以我寻找一个解决方案并找到了答案。您可以看到,为了不丢失更改字符集和排序规则的数据,必须先转换为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;

您必须通过
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
更多信息请访问:

请注意,对列运行任何
MODIFY
CHANGE
操作都会(在实际意义上)删除列上的任何默认值或注释

使用“更改”或“修改”时,列定义必须包含数据 类型和应应用于新列的所有属性,其他 而不是索引属性,如主键或唯一。属性 存在于原始定义中,但未为新定义指定 定义未结转

请执行
选择十六进制(col),col FROM…
查看为“école”存储的内容。Latin1看起来像E9636F6C65。如果我没有弄错的话,希伯来语中没有“é”。请参阅,了解可能支持的完整字符集

假设这是正确的,不要试图转换为字符集希伯来语;您将丢失信息,例如将“é”变为“?”


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

排序规则与数据的存储方式无关@user3159519我编辑我的答案,检查itOkay,谢谢,这非常有帮助。这意味着无论发生什么,某些转换都不可避免地会更改数据。然而,我想现在我想知道的是,我怎么知道特定的字符集转换不会改变我的数据。有没有sql查询或php库可以在我输入时为我确定这一点?听起来有些行是拉丁文的,有些是希伯来文的。这使得它很难修复。您认为您可以识别哪些行是哪些行吗?我已经尝试过了,但它不起作用。我相信一些字符转换不可避免地会改变数据。我现在想知道的是,有没有办法知道将排序规则更改为其他排序规则是否会损坏数据?一些sql查询或编程库?@user3159519我编辑我的答案,试试这个:ALTER TABLE某物修改名称VARCHAR(12)字符集utf8 COLLATE utf8_unicode_ciHey@Adrian Cid Almaguer,你提到的两个查询也可以合并吗?@user3159519我不知道这是指合并,但是,请复制数据库并尝试。如果我的答案对您有帮助,请不要忘了检查答案;-)如果数据正确,两步更改将损坏数据。相反,使用ALTERTABLE。。。转换为以更改定义和数据。