数据溢出到另一列



我正试图在Discord bot中使用sqlalchlemy来记录员工和用户之间的对话。

大多数情况下,事情都会被记录下来,但最近开始在向表中插入数据时遇到一些问题。

我们使用sqlalchemy来插入数据库。我不是专家,所以可能创建了一些错误的东西。

这是表对象:

engine = create_engine("mysql+pymysql://%s:%s@%s/%s" % (db_user, db_pass, db_host, database), echo = True)
meta = MetaData()
logs = Table(
'logs', meta,
Column('id', Integer, primary_key=True, autoincrement=True, nullable=False),
Column('agent', VARCHAR(45), nullable=False), 
Column('starttime', DATETIME, nullable=False),
Column('endtime', DATETIME, nullable=False),
Column('osid', VARCHAR(20), nullable=True),
Column('nickname', VARCHAR(45), nullable=False),
Column('discorduid', VARCHAR(30), nullable=False),
Column('log', String(99999999999999999999999999999999999999), nullable=False),
Column('tags', VARCHAR(45), nullable=True)
)
insert = logs.insert()
insert = logs.insert().values(agent=agent, starttime=start, endtime=end, osid='', nickname=user, discorduid=uid, log=messages, tags=tags)
connection = engine.connect()
result = connection.execute(insert)

以下是关于数据库中的表的信息:

MariaDB [discord]> describe logs;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| agent      | varchar(45) | NO   |     | NULL    |                |
| starttime  | datetime    | NO   |     | NULL    |                |
| endtime    | datetime    | NO   |     | NULL    |                |
| osid       | varchar(20) | YES  |     | NULL    |                |
| nickname   | varchar(45) | NO   |     | NULL    |                |
| discorduid | varchar(30) | NO   |     | NULL    |                |
| log        | longtext    | NO   |     | NULL    |                |
| tags       | varchar(45) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

我收到的错误显示,日志log=messages通过insert = logs.insert().values(agent=agent, starttime=start, endtime=end, osid='', nickname=user, discorduid=uid, log=messages, tags=tags)的列溢出到我的tags列中,如下所示,其中一些数据经过了编辑:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: DataError: (pymysql.err.DataError) (1406, "Data too long for column 'tags' at row 1")
[SQL: INSERT INTO logs (agent, starttime, endtime, osid, nickname, discorduid, log, tags) VALUES (%(agent)s, %(starttime)s, %(endtime)s, %(osid)s, %(nickname)s, %(discorduid)s, %(log)s, %(tags)s)]
[parameters: {'agent': 'X', 'starttime': datetime.datetime(2021, 5, 26, 19, 50, 55, 863000), 'endtime': datetime.datetime(2021, 5, 26, 20, 39, 56, 392000), 'osid': '', 'nickname': 'X', 'discorduid': 'X', 'log': 'OffSec Ninja:nHello X - this chat has been initiated by X so that we can better assist you.nnX:nHi X how are yo ... (5500 characters truncated) ... com/attachments/847200149520515102/847212337203380234/somefile.PNGnnX:nthe last buffer is the one that I'm changing from 5092 to 5098nn', 'tags': "last buffer is the one that I'm changing from 5092 to 5098"}]

当支持代理关闭专用1对1通道时,会填充tags列。

我检查了我插入的messages数据的长度,结果是5462。

这是mysql的限制吗?它一行可以存储多少?还是我把桌子上的东西搞砸了?

错误是由于SQL试图插入"最后一个缓冲区是我从5092改为5098的缓冲区,一个58个字符的字符串,转换为VARCHAR(45)。太长了。

我从未听说过MySQL允许列之间的文本内容溢出。它就是不起作用。因此,Python变量messagestags必须包含您在代码尝试将它们插入表之前在erro中看到的文本。调试那些Python变量的设置方式。

最新更新