【问题标题】:How to change Column Collation without losing or changing data?如何在不丢失或更改数据的情况下更改列排序规则?
【发布时间】:2015-05-18 00:41:33
【问题描述】:

我一直在使用 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;

【问题讨论】:

标签: mysql sql database character-encoding collation


【解决方案1】:

您必须将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 操作将(实际上)删除列上的任何默认值或注释as per the documentation

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

【讨论】:

  • 我已经尝试过了,但它不起作用。我相信一些字符转换不可避免地会改变数据。我现在要知道的是,有什么方法可以让我知道将排序规则更改为另一个排序规则是否会损坏数据?一些 sql 查询或编程库?
  • @user3159519 我编辑我的答案,试试这个:ALTER TABLE something MODIFY name VARCHAR(12) CHARACTER SET utf8 COLLATE utf8_unicode_ci
  • 嘿@Adrian Cid Almaguer,你提到的两个查询也可以合并吗?
  • @user3159519 我不知道你的意思是合并,但是复制你的数据库并尝试。如果我的回答对您有帮助,请不要忘记检查是否已接受 ;-)
  • 如果数据正确,两步 ALTER 将损坏数据。相反,使用 ALTER TABLE ... CONVERT TO 来更改定义和数据。
【解决方案2】:

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

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

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

【讨论】:

  • 好的,谢谢,这很有帮助。这意味着无论如何,某些转换不可避免地会更改数据。但是,我想现在我想知道的是,我怎么知道特定的字符集转换不会改变我的数据。是否有一个 sql 查询或一些 php 库可以在我输入时为我确定?
  • 听起来有些行是 latin1,有些是希伯来语。这使得修复变得困难。您认为您可以识别哪些行是哪些?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2019-08-23
  • 1970-01-01
  • 2011-02-13
  • 2010-11-20
相关资源
最近更新 更多