文档章节

rails mysql2中文编码及innodb前缀索引长度问题

病态S
 病态S
发布于 2017/04/17 13:14
字数 612
阅读 13
收藏 0

转自http://mensfeld.pl/2016/06/ruby-on-rails-mysql2error-incorrect-string-value-and-specified-key-was-too-long/。

Ruby on Rails,Mysql2 ::错误:字符串值不正确:'\ xF0 \ x9F \ x99 \ x82',指定的键太长; 最大密钥长度为767字节

02-06-2016 MACIEJ MENSFELD 0评论

如果你收到这样的错误:

1

Mysql2::Error: Incorrect string value: '\xF0\x9F\x99\x82'

这意味着您使用不支持完整Unicode的设置的Mysql版本。在Ruby on Rails中改变它应该是相当简单的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class ChangeEncoding < ActiveRecord::Migration[5.0]

  def change

    config = Rails.configuration.database_configuration

    db_name = config[Rails.env]["database"]

    collate = 'utf8mb4_polish_ci'

    char_set = 'utf8mb4'

 

    execute("ALTER DATABASE #{db_name} CHARACTER SET #{char_set} COLLATE #{collate};")

 

    ActiveRecord::Base.connection.tables.each do |table|

      execute("ALTER TABLE #{table} CONVERT TO CHARACTER SET #{char_set} COLLATE #{collate};")

    end

  end

end

但是您可能会遇到以下错误:

1

Specified key was too long; max key length is 767 bytes

767字节是InnoDB表的前缀限制。

要解决您需要:

  • 更新你的database.yml文件
  • 升级到MySQL 5.7或编辑您的my.cnf   以启用innodb_large_prefix
  • 将行格式更改为DYNAMIC
  • 使用Ruby on Rails迁移更改数据库和所有表

Database.yml

您需要更改ActiveRecord的编码和排序规则:(其中utf8mb4_polish_ci或可为utf8mb4_unicode_ci)

1

2

3

production:

  encoding: utf8mb4

  collation: utf8mb4_polish_ci

MySQL my.cnf

编辑my.cnf并添加以下行:

1

2

3

innodb_large_prefix=on

innodb_file_format=barracuda

innodb_file_per_table=true

DYNAMIC行格式 (或可忽略)

如果你不这样做,你可能会(如果你有足够的索引)会出现这个错误:

1

767 bytes is the stated prefix limitation for InnoDB tables

要更改行格式,您需要为每个表运行以下查询:

1

ALTER TABLE table_name ROW_FORMAT=DYNAMIC;

但是,您不需要手动执行此操作 - 下面将会找到一个Ruby on Rails迁移,它将完成所有必要的操作。

复杂的迁移设置一切,就像在MySQL数据库中一样

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class ChangeEncoding < ActiveRecord::Migration[5.0]

  def change

    config = Rails.configuration.database_configuration

    db_name = config[Rails.env]["database"]

    collate = 'utf8mb4_polish_ci'

    char_set = 'utf8mb4'

    row_format = 'DYNAMIC'

 

    execute("ALTER DATABASE #{db_name} CHARACTER SET #{char_set} COLLATE #{collate};")

 

    ActiveRecord::Base.connection.tables.each do |table|

      execute("ALTER TABLE #{table} ROW_FORMAT=#{row_format};")

      execute("ALTER TABLE #{table} CONVERT TO CHARACTER SET #{char_set} COLLATE #{collate};")

    end

  end

end

运行此迁移后,一切都应该正常运行。

 

另补充:

1.该迁移文件则可根据其中声明的迁移类名来定义,即如20170417033252_change_encoding.rb。

2.数据库中默认或有ar_internal_metadata和schema_migrations之类的表存在,使得运行上面的迁移的时候发生错误而中断执行,可修改该迁移文件加一if判断,如

 

 

本文转载自:http://mensfeld.pl/2016/06/ruby-on-rails-mysql2error-incorrect-string-value-and-specified-key-was-to

共有 人打赏支持
病态S
粉丝 1
博文 82
码字总数 35423
作品 0
程序员
MySQL 问题分析:ERROR 1071 (42000) : Specified key was too long; max key length is 767 bytes

原文出处:潇湘隐者 今天在MySQL 5.6版本的数据库中修改InnoDB表字段长度时遇到了”ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes”错误,第一次遇到这个错误...

潇湘隐者
09/25
0
0
mysql数据库my.ini配置文件中文详解

mysqld程序–目录和文件 引用 basedir = path 使用给定目录作为根目录(安装目录)。 character-sets-dir = path 给出存放着字符集的目录。 datadir = path 从给定目录读取数据库文件。 pid-fi...

岭南六少
2011/09/22
0
0
MySQL索引的索引长度问题

MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。 在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设...

foxbrother
2012/03/05
0
0
Data truncation: Data too long for column '****'

今天写代码时发现中文存入mysql乱码了。 我的数据持久化框架用的Hibernate。首先我确认JSP页面传入后台的中文数据没有乱码,因此我确信是中文数据在存储时出了问题。网上查阅资料,许多人说可...

ZhangFinder
2015/08/12
0
0
迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)

MySQL 5.7版本于2015年10月份左右GA,至今已经大半年了,但作为MySQL DBA的我却一直没时间follow它的特性,实在惭愧,以后会花时间来研究5.7版本的特性并针对部分优化功能做出压力测试。 本系...

杨奇龙
2016/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链教程以太坊源码分析chain-indexer区块链索引一

兄弟连区块链教程以太坊源码分析chain-indexer区块链索引一 chain_indexer 区块链索引 chain_indexer.go 源码解析 chain_indexer 顾名思义, 就是用来给区块链创建索引的功能。 之前在eth协议...

兄弟连区块链入门教程
7分钟前
0
0
社会化分享插件集成分享

一.前提摘要 社会化分享每个app必备的推广需求,无论是拉新,邀请,游戏奖励,等等都离不开分享的影子,下面我们介绍下社会化分享的插件; 首先要说下,现在的社交App,社区App等,国内外的...

佳妮
7分钟前
0
0
IOC 之 Spring 统一资源加载策略

统一资源:Resource org.springframework.core.io.Resource 为 Spring 框架所有资源的抽象和访问接口 它继承 org.springframework.core.io.InputStreamSource接口 作为所有资源的统一抽象,S...

职业搬砖20年
8分钟前
0
0
Python爬虫实战入门一:工具准备

一、基础知识 使用Python编写爬虫,当然至少得了解Python基本的语法,了解: 基本数据结构 数据类型 控制流 函数的使用 模块的使用 不需要过多过深的Python知识,仅此而已。 个人推荐《Pytho...

糖宝lsh
12分钟前
0
0
Hanlp中使用纯JAVA实现CRF分词

Hanlp中使用纯JAVA实现CRF分词 与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与...

左手的倒影
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部