Die*_*o87 50 mysql sql create-table
我想创建一个325列的表:
CREATE TABLE NAMESCHEMA.NAMETABLE
(
ROW_ID TEXT NOT NULL , //this is the primary key
324 column of these types:
CHAR(1),
DATE,
DECIMAL(10,0),
DECIMAL(10,7),
TEXT,
LONG,
) ROW_FORMAT=COMPRESSED;
Run Code Online (Sandbox Code Playgroud)
我用TEXT替换了所有VARCHAR,我在MySQL的my.ini文件中添加了Barracuda,这是添加的属性:
innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_file_format_check = ON
Run Code Online (Sandbox Code Playgroud)
但我仍然有这个错误:
Error Code: 1118
Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Run Code Online (Sandbox Code Playgroud)
编辑:我无法更改数据库的结构,因为它是遗留的应用程序/系统/数据库.创建一个新表,它是遗留数据库的导出.
编辑2:我写的这个问题与其他人类似,但内部有一些我在互联网上找到的解决方案,如VARCHAR和Barracuda,但我仍然有这个问题所以我决定打开一个新的问题已经内部的经典答案,看看是否有人有其他答案
小智 50
由于MySQL Server 5.6.20的更改,我最近遇到了相同的错误代码.我能够通过更改my.ini文本文件中的innodb_log_file_size来解决问题.
在发行说明中,解释了innodb_log_file_size太小会触发"行大小太大的错误".
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html
小智 49
我在这里尝试了所有解决方案,但只有这个参数
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)
解决了我的一天......
从手册:
innodb_strict_mode设置会影响CREATE TABLE,ALTER TABLE和CREATE INDEX语句的语法错误处理.innodb_strict_mode还启用记录大小检查,以便INSERT或UPDATE永远不会因为记录对于所选页面大小而言太大而失败.
小智 27
ERROR 1118 (42000) at line 1852:
Row size too large (> 8126). Changing some columns to TEXT or
BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Run Code Online (Sandbox Code Playgroud)
[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)
ubuntu 16.04编辑路径:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)
在MS Windows上,路径将是这样的:
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
Run Code Online (Sandbox Code Playgroud)
不要忘记重新启动服务(或重启机器)
Nan*_*mar 17
如果启用了 InnoDB 严格模式,则会显示此错误。
检查是否启用
SHOW variables LIKE '%strict%';
Run Code Online (Sandbox Code Playgroud)
如果启用则可以禁用。
SET GLOBAL innodb_strict_mode=OFF;
Run Code Online (Sandbox Code Playgroud)
欲了解更多详细信息,请阅读此处>>
Sta*_*tar 16
今天早上有类似的问题,以下方法救了我的命:
你试过关掉innodb_strict_mode
吗?
SET GLOBAL innodb_strict_mode = 0;
Run Code Online (Sandbox Code Playgroud)
然后再次尝试导入。
innodb_strict_mode
在关闭之前,使用 MySQL >= 5.7.7 打开。
Fra*_*zCC 13
对于 MariaDB 用户(版本 >= 10.2.2)和 MySQL(版本 >= 5.7),简单的解决方案是:
ALTER TABLE `table` ROW_FORMAT=DYNAMIC;
Run Code Online (Sandbox Code Playgroud)
在 MacOS 上(使用 Brew)将 SQL 转储(从 MySQL 8)导入到 MariaDB 时遇到了问题。
首先编辑您的my.cnf
.
如果您使用 Brew,它通常存储在/usr/local/etc/
:
pico /usr/local/etc/my.cnf
Run Code Online (Sandbox Code Playgroud)
将此添加到配置中:
[mysqld]
innodb_log_file_size = 1024M
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)
然后重启 MariaDB:
brew services restart mariadb
Run Code Online (Sandbox Code Playgroud)
请注意,这是一种解决方法,而不是修复方法,因为在不解决问题的情况下切换了严格模式,但由于它是我的本地环境而不是生产环境,因此我对此没有意见。
小智 8
关键参数是:innodb_page_size
MySQL 5.7中增加了对32k和64k页面大小的支持。对于32k和64k页面大小,最大行长度约为16000字节。
诀窍在于,只能在 mysql服务实例的INITIALIZATION期间更改此参数,因此,如果在实例已初始化(实例的第一次运行)后更改此参数,则它不会有任何影响。
只能在初始化MySQL实例之前配置innodb_page_size,此后不能更改。如果未指定任何值,则使用默认页面大小初始化实例。请参见第14.6.1节“ InnoDB启动配置”。
因此,如果不在初始化前在my.ini中更改此值,则默认值为16K,行大小限制为〜8K。这就是为什么出现错误。
如果增加innodb_page_size,则也必须增加innodb_log_buffer_size。将其设置为至少16M。同样,如果ROW_FORMAT设置为COMPRESSED,则不能将innodb_page_size增加到32k或64K。它应该是动态的(5.7中的默认值)。
当innodb_page_size设置为32KB或64KB时,不支持ROW_FORMAT = COMPRESSED。对于innodb_page_size = 32k,扩展区大小为2MB。对于innodb_page_size = 64k,扩展区大小为4MB。使用32k或64k页面大小时,应将innodb_log_buffer_size设置为至少16M(默认值)。
此外,应将innodb_buffer_pool_size至少从128M增加到512M,否则您将在实例初始化时收到错误消息(我没有确切的错误)。
此后,行大小错误消失了。
问题是您必须创建一个新的MySql实例,并将数据从旧实例迁移到新的DataBase实例。
我更改并工作的参数(在创建新实例并使用首先使用这些设置修改的my.ini初始化之后):
innodb_page_size=64k
innodb_log_buffer_size=32M
innodb_buffer_pool_size=512M
Run Code Online (Sandbox Code Playgroud)
我在其中找到解决方案的所有设置和说明都可以在这里找到:
https://dev.mysql.com/doc/refman/5.7/zh-CN/innodb-parameters.html
希望这可以帮助!
问候!
更改为 MyISAM 不是解决方案。对于 innodb 以下为我工作。
在 my.cnf 上设置以下内容
innodb_strict_mode=0
Run Code Online (Sandbox Code Playgroud)
对于 Mac OS X El Capitan 上的 MySQL 5.7:
OS X 在 /usr/local/mysql/support-files/my-default.cnf 提供示例配置文件
要添加变量,首先停止服务器并将上面的文件复制到,/usr/local/mysql/etc/my.cnf
cmd : sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf
Run Code Online (Sandbox Code Playgroud)
注意:如果它不存在,请在“mysql”下创建“etc”文件夹。
cmd : sudo mkdir /usr/local/mysql/etc
Run Code Online (Sandbox Code Playgroud)
一旦 my.cnf 在 etc. 下创建,就该在其中设置变量了。
cmd: sudo nano my.cnf
Run Code Online (Sandbox Code Playgroud)
在 [mysqld] 下面设置变量
[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)
现在启动一个服务器!
小智 6
我只是想为其他一些人提供帮助,解决这个问题的更严重的变体。在某些情况下,即使使用“alter table drop columns”和“alter table修改列”语句,也会出现错误(“行大小太大..将某些列更改为TEXT或BLOB”)!
因此,您可能会完全陷入困境,无法将 varchar 更改为文本,或删除列(讽刺的是,尝试解决问题会导致相同的消息)。
如果您遇到此问题,解决方案是一次更改或删除多个列。您可以在 MySQL 中使用语法“alter table example drop column a, drop column b, drop column c”来执行此操作,如果您一次删除足够多的列,它实际上会执行而不是引发错误。
MySQL 非常清楚它的最大行大小:
每个表(无论存储引擎如何)的最大行大小为 65,535 字节。存储引擎可能会对此限制设置额外的约束,从而减少有效的最大行大小。
. . .
单个存储引擎可能会施加额外的限制来限制表列数。例子:
InnoDB 最多允许 1000 列。
InnoDB 将行大小限制为小于数据库页面的一半(大约 8000 字节),不包括 VARBINARY、VARCHAR、BLOB 或 TEXT 列。
不同的 InnoDB 存储格式(COMPRESSED、REDUNDANT)使用不同数量的页头和尾部数据,这会影响行可用的存储量。
如果您有 325 组重复的列,则超出了几个限制。这也是一种可疑的数据格式。表格中的每一行应该有 325 行,每组列一个。
小智 5
innodb_log_file_size=512M
innodb_strict_mode=0
Run Code Online (Sandbox Code Playgroud)
这两行在 mysql 配置中对我有用!
归档时间: |
|
查看次数: |
117464 次 |
最近记录: |