gpt4 book ai didi

mysql - MySql.Data.MySqlClient.MySqlCommand.ExecuteReader 的 DataColumn MaxLength 问题

转载 作者:行者123 更新时间:2023-11-28 23:14:37 25 4
gpt4 key购买 nike

我正在尝试将我的数据从 SQLite 迁移到 MySQL 数据库,但这个奇怪的问题一次又一次地出现。

我有这张表,与其他表没有关系:

CREATE TABLE `tableClassesNacionaisH` (
`id` int(11) DEFAULT NULL,
`nome` varchar(255) DEFAULT NULL,
`situacao` varchar(255) DEFAULT NULL,
`codigoNacional` int(11) DEFAULT NULL,
`codigoNacionalPai` int(11) DEFAULT NULL,
`natureza` varchar(255) DEFAULT NULL,
`dispositivoLegal` varchar(255) DEFAULT NULL,
`artigo` varchar(255) DEFAULT NULL,
`sigla` varchar(255) DEFAULT NULL,
`poloAtivo` varchar(255) DEFAULT NULL,
`numeracaoPropria` varchar(255) DEFAULT NULL,
`glossario` text,
`lft` int(11) DEFAULT NULL,
`lvl` int(11) DEFAULT NULL,
`rgt` int(11) DEFAULT NULL,
`root` int(11) DEFAULT NULL,
`justEs1Grau` varchar(11) DEFAULT NULL,
`justEs2Grau` varchar(11) DEFAULT NULL,
`justEsJuizadoEs` varchar(11) DEFAULT NULL,
`justEsTurmas` varchar(11) DEFAULT NULL,
`justEs1GrauMil` varchar(11) DEFAULT NULL,
`justEs2GrauMil` varchar(11) DEFAULT NULL,
`justEsJuizadoEsFp` varchar(11) DEFAULT NULL,
`justTuEsUn` varchar(11) DEFAULT NULL,
`justFed1Grau` varchar(11) DEFAULT NULL,
`justFed2Grau` varchar(11) DEFAULT NULL,
`justFedJuizadoEs` varchar(11) DEFAULT NULL,
`justFedTurmas` varchar(11) DEFAULT NULL,
`justFedNacional` varchar(11) DEFAULT NULL,
`justFedRegional` varchar(11) DEFAULT NULL,
`justTrab1Grau` varchar(11) DEFAULT NULL,
`justTrab2Grau` varchar(11) DEFAULT NULL,
`justTrabTst` varchar(11) DEFAULT NULL,
`stf` varchar(11) DEFAULT NULL,
`stj` varchar(11) DEFAULT NULL,
`cjf` varchar(11) DEFAULT NULL,
`cnj` varchar(11) DEFAULT NULL,
`justMilUniao1Grau` varchar(11) DEFAULT NULL,
`justMilUniaoStm` varchar(11) DEFAULT NULL,
`justMilEst1Grau` varchar(11) DEFAULT NULL,
`justMilEstTjm` varchar(11) DEFAULT NULL,
`justElei1Grau` varchar(11) DEFAULT NULL,
`justElei2Grau` varchar(11) DEFAULT NULL,
`justEleiTse` varchar(11) DEFAULT NULL,
`criadoEm` datetime DEFAULT NULL,
`atualizadoEm` datetime DEFAULT NULL,
`parent_id` int(11) DEFAULT NULL,
`poloPassivo` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

为了隔离错误,我写了这个测试例程:

Private Shared Sub TestSub()
Dim command_text As String = "SELECT * FROM atena.tableClassesNacionaisH;"
Dim connection As MySql.Data.MySqlClient.MySqlConnection = AppSet.Atena.Connection
Dim command As New MySql.Data.MySqlClient.MySqlCommand(command_text, connection)
Dim table As New DataTable
Dim dataexception As Exception = Nothing
Dim rowsinerror As DataRow() = {}
connection.Open()
Try
table.Load(command.ExecuteReader)
Catch dataexception
End Try
connection.Close()
rowsinerror = table.GetErrors
If dataexception IsNot Nothing Then
Debug.Print(dataexception.GetType.ToString)
Debug.Print(dataexception.Message)
For Each rowinerror In rowsinerror
Debug.Print(rowinerror.RowError)
Next
Debug.Print(table.Columns("glossario").MaxLength)
End If
End Sub

这些依次是异常类型、异常消息、第一行错误(翻译成英文是我的)和 table.Columns("glossario").MaxLength 的值:

System.Data.ConstraintException

Fail activating restrictions. One or more rows contain values that violate non-null, unique or foreign-key restrictions.

Column 'glossario' exceeds MaxLength limit.

21845

因为我不知道这个数字 (21845) 是如何推断出来的,所以我转到 MySQL Workbench 并运行了以下查询:

SELECT max(length(glossario)) FROM tableClassesNacionaisH;

结果是 34504。

问题来了:

*如果 来自特定查询 的真实字段内容可以与 一样长,为什么 glossario 列的 MaxLength 设置为 21845>34504TEXT DataType has maximum length of 65535 characters

我该如何预防/规避这个问题?*

非常感谢。

编辑: 一位 friend 向我指出 21845 恰好是 65535 的 1/3,这让我怀疑问题与字符集有关。我通过将列的数据类型更改为 MEDIUMTEXT 来规避它,从而将上限提高到 16,777,215 个字符(或字节?,我不确定了)。但问题仍然存在:MySQL did 在 TEXT 列中存储了一个 34504 长的字符串,但没有截断它。 CLR 类型 System.String 没有 21845 或 65535 个字符这样的下限(假设它可能包含大约 10 亿个字符,但我认为少一些...很好)。

最佳答案

在您提供的链接中,它明确指出对于 TEXT 字段,“如果值包含多字节字符,有效的最大长度会更短。

UTF-8 是一种 Unicode 字符集,也是您数据库的默认字符集。它对匹配 ASCII 集的前 128 个字符使用 1 字节表示,对其余字符使用 4 字节表示。

这意味着 TEXT 列可以存储更多或更少的字符,具体取决于字符是否为 ASCII。

现在,当 MySQL 驱动程序没有正确处理这个问题时,您的问题就来了,将假定所有 UTF-8 字符都是 4 字节宽,并将列长度除以 4 字节,然后将其作为实际字段长度传递给 DataTable。这意味着从技术上讲,您的数据库中可能存在一些不适合 DataTable 的文本,就像您的情况一样。

您的问题的解决方案(或本例中的解决方法)正是您目前所做的,即将列更改为可以包含更多字符的类型,如 MEDIUMTEXT 或 LONGTEXT。

我猜这个决定是为了简化 MySQL 驱动程序的实现,但我会考虑向 Oracle 提交错误报告。

关于mysql - MySql.Data.MySqlClient.MySqlCommand.ExecuteReader 的 DataColumn MaxLength 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44443782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com