部署 求助:MySQL 表的编码变为 latin1_swedish_ci ,在 cap 部署后 (closed)

appell · 2015年11月27日 · 最后由 steveltn 回复于 2015年12月18日 · 3072 次阅读

环境:Rails 4.2.1,Mysql2 0.3.19

新建一个表叫做 infomation,在本地开发环境下,表的编码是 utf8_unicode_ci。

cap 部署到服务器后 infomation 表的编码是 latin1_swedish_ci。

补充背景:之前已经通过 migrate 建立了几个表(在开发中的项目),编码是 utf8 的。现在不知道哪里出了问题,在服务器上新建表的编码会变为 latin1。

求助如何排查问题?

其它资料:

  1. mysql 的编码

之前 MySQL 中 character_set_database 和 character_set_server 的编码是 latin1,截图是在修改了 my.cn 后。

  1. 表的编码

临时的解决办法(staging 环境):

  • rake db:drop
  • rake db:create
  • cap deploy ...

更新

  • 在发布到生产服务器时没有产生问题。
  • 以后记得安装完 MySQL 后更改编码配置
  • closed

@springwq 谢谢回复。

我的担心是在 production 环境部署后也是要去手动修改表的编码。

之前没有出现过这个情景,同样的配置(环境)下。所以希望能找到为什么会在 db migrate 后表的编码变为 latin1。

这次需要生成的表也是通过 rails g model xxx 产生的。

您的数据库是不是自己手动在 mysql 里新建的?

帮客户处理过 n 次这样的情况,已经驾轻就熟了,在没有改变 character_set 之前的表数据,先以 Latin 字符集 dump 出来,然后用 iconv 转一下导出的文本文件字符,然后在以 utf-8 导入一次即可。

原因:貌似应该是发布的服务器环境所致,可以看看这个http://www.extendi.it/blog/2013/12/18/10-utf-8-tables-on-aws-rds-and-rails-migrations 解决方法:直接在 migration 中添加 options,就可以

create_table : infomations, options: 'COLLATE=utf8_unicode_ci' do |t|

@messiahxu 数据库是通过 mysql console 建立的。

之前的表是通过 db migrate 建立,编码是正确的-utf8。 现在的表也是通过 db migrate 建立的,编码变为 latin1。

@lgn21st 感谢回复,新加了“补充背景”,之前的描述不够完整。

补充背景:之前已经通过 migrate 建立了几个表(在开发中的项目),编码是 utf8 的。现在不知道哪里出了问题,在服务器上新建表的编码会变为 latin1。

更新:在服务器上部署,表的编码是 utf8。

服务器一个截图:

只有 character_set_server 是 latin1 编码。staging 服务器上 character_set_database 也是 latin1 编码。

#8 楼 @appell 在服务器上修改了 my.conf 之后,只对修改之后新创建的 table 有效。

这是一件很坑的事情,MySQL 的默认语言是瑞典语!因为这是一个瑞典人无聊时开发的,连起名字都很随意——他的大女儿叫 My ……

他小女儿叫什么呢?Maria!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号