文档章节

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

病态S
 病态S
发布于 2017/04/17 13:14
字数 612
阅读 7
收藏 0
点赞 0
评论 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
博文 81
码字总数 35375
作品 0
程序员
Data truncation: Data too long for column '****'

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

ZhangFinder
2015/08/12
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
迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)

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

杨奇龙
2016/06/27
0
0
mysql的varchar与text对比

varchar和text是mysql字符存储争议比较多的领域,究竟大字段用那个比较好,我们来对比一下,然后自行选择. 大小对比 VARCHAR :varchar在mysql中满足最大行限制,也就是 65535(16k)字节,在mys...

arthur376
05/28
0
0
高性能mysql读书笔记之二 – 架构优化和索引

第三章 架构优化和索引 第三章的主要是说合理使用不同的数据类型和索引。主要需要注意的内容有如下: 1. 通用原则 1.1. 数据类型更小通常更好。 1.2. 数据类型越简单越好 1.3. 尽量避免使用N...

大数据之路
2012/12/01
0
0
mysql 索引过长1071-max key length is 767 byte

问题 create table: Specified key was too long; max key length is 767 bytes 原因 数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引 而mysql默认情况下单个列的索引不能超...

美码师
2015/07/01
0
0
由浅入深探究mysql索引结构原理、性能分析与优化

摘要: 第一部分:基础知识: 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构。笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料。关键...

chape
2013/04/15
0
1
由浅入深探究mysql索引结构原理、性能分析与优化

摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1、 简单介绍B-tree B+ tree树 2、 MyisAM索引结构 3、 Annode索引结构 4、 MyisAM索引与InnoDB索引相比较 第三部分:MYSQL优化...

大数据之路
2012/08/21
0
0
由浅入深探究mysql索引结构原理、性能分析与优化

摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1、 简单介绍B-tree B+ tree树 2、 MyisAM索引结构 3、 Annode索引结构 4、 MyisAM索引与InnoDB索引相比较 第三部分:MYSQL优化...

蓝狐乐队
2014/07/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring基础

Spring是什么? Spring是一个开源框架,最早由Rod Johnson创建,它解决的是业务逻辑层和其他各层的松耦合问题。 经过十几年的发展,Spring正在扩展其他的领域,如:移动开发、社交API集成、N...

这很耳东先生
9分钟前
0
0
面试系列-40个Java多线程问题总结

前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也...

Ryan-瑞恩
22分钟前
0
0
微信分享的细节

分享的缩略图要求: 一、图片大小小于32k 二、图片的尺寸为 宽度 :128px 高度:128px 分享title 和 description 出现金额等 以上情况存在会导致触发分享按钮 但是页面没有反应...

Js_Mei
28分钟前
0
0
【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】

1、编写shell脚本,计算1-100的和; #!/bin/bashsum=0for i in `seq 1 100`do sum=$[$sum+$i]doneecho $sum 2、编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求...

lgsxp
30分钟前
0
0
xss攻防浅谈

导读 XSS (Cross-Site Script) 攻击又叫跨站脚本攻击, 本质是一种注入攻击. 其原理, 简单的说就是利用各种手段把恶意代码添加到网页中, 并让受害者执行这段脚本. XSS能做用户使用浏览器能做的...

吴伟祥
30分钟前
0
0
js回调的一次应用

function hideBtn(option) { if (option == 1) { $("#addBtn").hide(); $("#addSonBtn").hide(); }}$("body").on("click", "#selectBtn", function () {......

晨猫
37分钟前
0
0
C++_读写ini配置文件

1.WritePrivateProfileString:写配置文件 WritePrivateProfileString 函数的定义形式为: BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTST......

一个小妞
37分钟前
0
0
通往阿里,BAT的50+经典Java面试题及答案解析(上)

Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性...

Java大蜗牛
37分钟前
1
0
数据库两大神器【索引和锁】

前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。 本文力求简单讲清每个知识点,希望大家看完能有所收获 声明:如果没有说明具体的数据库...

Java3y
41分钟前
0
0
Application Express安装

Application Express安装文档 数据库选择和安装 数据库选择 Oracle建议直接12.2.0.1.0及以上的版本,12.1存在20618595bug(具体可参见官方文档) Oracle 12c 中安装oracle application expr...

youfen
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部