仅更改MySQL数据库字符集和排序规则(Rails应用程序)

仅更改MySQL数据库字符集和排序规则(Rails应用程序),mysql,ruby-on-rails,encoding,utf-8,character-encoding,Mysql,Ruby On Rails,Encoding,Utf 8,Character Encoding,看来我正在处理一个相当普遍的问题。My production MySQL数据库有一个默认字符集和排序规则latin1/latin1\u swedish\u ci。我很早就忘了更改它,我的Rails应用程序已经发展到一个相当大的规模,拥有国际观众;当表情符号显示为问号时,非英语字符会引发异常 我知道我面前有一项艰巨的任务,就是转换成utf8mb4/utf8mb4\u general\u ci。据我所知,如果我只是运行类似于我的数据的东西,最终可能会被破坏 这样更改数据库范围的字符集/排序规则似乎相

看来我正在处理一个相当普遍的问题。My production MySQL数据库有一个默认字符集和排序规则
latin1
/
latin1\u swedish\u ci
。我很早就忘了更改它,我的Rails应用程序已经发展到一个相当大的规模,拥有国际观众;当表情符号显示为问号时,非英语字符会引发异常

我知道我面前有一项艰巨的任务,就是转换成
utf8mb4
/
utf8mb4\u general\u ci
。据我所知,如果我只是运行类似于我的数据的东西,最终可能会被破坏

这样更改数据库范围的字符集/排序规则似乎相当简单:

alterdatabasemydbname字符集=utf8mb4-COLLATE=utf8mb4\u-general\u-ci

我的问题是,仅仅更改数据库字符集/排序规则是否会立即影响读写?或者这只是确定在数据库中创建新表时应用的编码


如果我想最终转换我所有的表,第一步似乎是首先处理数据库范围的级别。。。但这会立即产生什么副作用呢

是的,更改编码可以立即工作,但在数据库级别上,它只更改新表的默认编码,要使其与现有列一起工作,必须更改列级别的编码。当您这样做时,您可能会遇到一些错误,例如缺少磁盘空间(从1字节转换为2字节或4字节时,您将需要更多的空间)或每个表的最大分配行空间溢出,如果该表有许多
VARCHAR
列,因为MySQL不能为每行分配超过66kB的空间,请参阅。

Yes,更改编码可以立即工作,但在数据库级别上它只更改新表的默认编码,要使其与现有列一起工作,必须更改列级别的编码。当您这样做时,您可能会遇到一些错误,例如缺少磁盘空间(从1字节转换为2字节或4字节时,您将需要更多的空间)或每个表的最大分配行空间溢出,如果表有许多
VARCHAR
列,因为MySQL不能为每行分配超过66kB的空间,请参阅。

小心
ALTER
。如果你用错了口味,事情会变得更糟


下面是一个检查表,它说明了使用哪种风格的
ALTER

小心
ALTER
。如果你用错了口味,事情会变得更糟



下面是导致使用哪种风格的
ALTER
的检查表:

因此短版本是:
ALTER DATABASE
将应用于新表,
ALTER TABLE CHARACTER SET
将应用于新列,
ALTER TABLE MODIFY CHARACTER SET
将追溯应用于列中的所有数据。好,因此,
alterdatabase
不一定会立即影响读/写操作。就像你说的,它只是设定了未来的新表。。。是吗?@DelPiero是的,如果不明显,很抱歉,
ALTER DATABASE
根本不影响任何读写操作,它只影响以下
CREATE
语句。64KB的限制是假的。如果遇到这样的情况,有一个解决办法。因此,简短的版本是:
ALTER DATABASE
将应用于新表,
ALTER TABLE CHARACTER SET
将应用于新列,
ALTER TABLE MODIFY CHARACTER SET
将追溯应用于列中的所有数据。确定,因此,
alterdatabase
不一定会立即影响读/写操作。就像你说的,它只是设定了未来的新表。。。是吗?@DelPiero是的,如果不明显,很抱歉,
ALTER DATABASE
根本不影响任何读写操作,它只影响以下
CREATE
语句。64KB的限制是假的。如果你遇到这样的事情,有一个解决办法。这很有帮助,谢谢。请原谅我的初学者问题,但什么时候事情会变得更糟?现在,我的表在各种
TEXT
VARCHAR
字段中都有
latin1
编码。人们在网站上主要用英语写作,但如果你输入中文字符,就会出现错误。我做了一个测试,将一个表转换为
utf8
altertablemytable转换为字符集utf8
),结果很好,现有的文本看起来不错,现在汉字也可以了。危险是什么?@DelPiero-你知道有多少不同的病例吗?我花了很长时间才发现所有这些案例并找出它们。我仍然担心一些案件会丢失。这是唯一一个错误的案例。如果您弄乱了字符并应用了错误的
ALTER
,现在有两个错误。修复列表以二次方方式增长!通常我会把人们引向这篇文章:@DelPiero-还有。。。我最喜欢的诊断方法是从样本中获取十六进制值。我可以快速确定它是3字节中文还是4字节中文,还是乱码“双重编码”,等等。注:utf8仅限于3字节中文;你应该使用utf8mb4。据我所知,从utf8到utf8mb4
VARCHAR
length 255不起作用?@DelPiero-对于MySQL 5.5和5.6,在为这样一个列编制索引时需要一个变通方法:这很有帮助,谢谢。请原谅我的初学者问题,但什么时候事情会变得更糟?现在,我的表在各种
TEXT
VARCHAR
字段中都有
latin1
编码。人们在网站上主要用英语写作,但如果你输入中文字符,就会出现错误。我做了一个测试,将一个表转换为
utf8
altertablemytable转换为字符集utf8
),结果很好,现有的文本看起来不错,现在汉字也可以了。危险是什么?@DelPiero-你知道有多少不同的病例吗?