- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将我的数据从 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>34504 和 TEXT 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/
我的 C# 项目有问题。我使用 MySQL 数据库,并使用 MySQL 网站上的 MySQL 连接器驱动程序,但光标和连接有问题。事实上,Visual Studio 表示不可能从第二个过程读取数据,因
我在从 sqlServer 中的表填充 Windows 窗体上的列表框时遇到了一些麻烦。该表是一列字符串值,因为我很不喜欢在我的应用程序中多次调用这个值列表,所以我将它设置为一个类,并在默认构造函数中
我有一个名为“MatchType”的表,它包含: ID | MatchTypeName 1 | One Day 2 | Two Day 3 | T20 我有一种方法可以根据与 MatchType
当我运行 cmd.ExecuteScalar() 或 cmd.ExecuteNonQuery() 时,命令对象上的 Output 和 InputOutput 参数会根据存储过程中的更改进行更新。但是,
考虑以下代码: StringBuilder textResults = new StringBuilder(); using(SqlConnection connect
我正在尝试从 powershell 脚本中的 SQL 表中读取数据。我可以在 reader 对象中看到数据,但是在使用 While (readerobject.read()){} 读取它时,它不会进入
好的,我在本周早些时候询问了这个非常错误的问题,并得到了一些非常有用的答案,毫无疑问,自从我开始遵循这些建议以来,情况已经有了很大的改善。 但是,现在我正在使用“正确”的最佳实践方法来访问数据库,但在
我有一个名为 DbTest 的数据库和一个名为 user 的表。它在行中抛出异常 cmd.ExecuteReader(); 异常消息说: There is an error parsing the q
我正在尝试从我的数据库中读取值。但为什么我只得到没有列名的值?这是我的 Controller 。返回 JSON 中的值 SqlCommand cmd = con.CreateC
我们有一个应用程序,给人的印象是由于数据库响应不佳而成为瓶颈。数据库和应用程序服务器的负载都不重,但应用程序花费大量时间通过 ExecuteReader 进行查询。 我们正在测量两件事:SQL Ser
我需要检索存储在包含数千项的数据库中的信息。如果我通过这种方式逐一进行,则需要花费大量时间(tac 是一个 8 个字符的字符串): string connectionString = @"Provid
很明显,ExecuteReader 用于只读,ExecuteNonQuery 用于事务。但出于某种原因,即使我使用 ExecuteReader,我仍然能够运行写入(插入、更新、删除)命令(在 text
不确定这是 Npgsql 或 Dapper 中的错误还是我做错了。 我正在尝试插入一个记录数组并返回插入的行以获取插入的 ID。记录作为 Postgres 数组参数传递 C#类 public clas
我正在为名为 OTServer 的游戏服务器编写数据库管理器,但我第二次使用 executereader() 时遇到问题。这是代码: private void button1_Click(ob
我注意到我的网页上有一些奇怪的行为。我有一个 WCF 数据服务,它提供 JSON 来填充 jqGrid。使用 javascript/ajax 调用该服务。 然后我有一些服务器端代码也调用相同的 WCF
我是 ASP.NET 的新手,作为一项自选任务,我要创建一个简单的博客。快完成了,但我遇到了一个问题。正如您从代码中看到的那样,我首先使用查询从我的 SQL 服务器数据库中返回博客条目的数量。然后,f
我很困惑,我正在尝试从数据库中填充 5 个文本框,但并非所有 5 个文本框都会始终有数据。 例子: 编号 |元素编号 | QType 1 | 10 | 2盒 2 | 10 | 6盒 3 | 11 |
我有一个接受输入并返回多列的存储过程。当我从 SSMS 以及 VS 2013 内部执行存储过程时,该存储过程有效。但是,当我尝试使用 SqlCommand.ExecuteReader 执行它时,读取器
我必须用单个事务插入两个表,必须实现的查询如下。其次在 SqlDataReader read = comm.ExecuteReader(); 获取异常 public void SqlExecuteNo
在 SQL 2008 和 C# 4.0 上使用存储过程时,我无法检索输出信息并从 Select 语句返回信息。我不断收到“对象引用未设置到对象的实例”。当我执行 ExecuteScalar() 时,我
我是一名优秀的程序员,十分优秀!