C# 检索MySQL默认值
我正在使用MySqlConnect for.Net(MySql.Data.dll状态为版本6.7.4.0),并通过XAMPP使用phpMyAdmin运行本地MySql服务器。 phpMyAdmin的版本似乎是4.0.9,MySQL本身的版本是5.6.14-MySQL社区服务器(GPL) 我遇到的问题与我指定为二进制值的默认值有关。 我试图导出我的数据库,经过几分钟的反复尝试,我成功地使用mysqldump将数据导出为二进制十六进制字符串。 问题是,虽然导出的sql文件的INSERT语句使用了我想要的非常好、整洁的十六进制字符串,但结构的默认说明符却没有 下面是一个例子:C# 检索MySQL默认值,c#,mysql,C#,Mysql,我正在使用MySqlConnect for.Net(MySql.Data.dll状态为版本6.7.4.0),并通过XAMPP使用phpMyAdmin运行本地MySql服务器。 phpMyAdmin的版本似乎是4.0.9,MySQL本身的版本是5.6.14-MySQL社区服务器(GPL) 我遇到的问题与我指定为二进制值的默认值有关。 我试图导出我的数据库,经过几分钟的反复尝试,我成功地使用mysqldump将数据导出为二进制十六进制字符串。 问题是,虽然导出的sql文件的INSERT语句使用了我想
CREATE TABLE `users` (
`id` bigint(13) unsigned NOT NULL AUTO_INCREMENT,
`online` tinyint(1) NOT NULL DEFAULT '1',
`map` int(11) NOT NULL,
`x` int(11) NOT NULL DEFAULT '10000',
`y` int(11) NOT NULL DEFAULT '10000',
`ally` int(11) NOT NULL DEFAULT '255',
`rank` int(11) NOT NULL DEFAULT '0',
`health` int(11) DEFAULT '400',
`shield` int(11) NOT NULL DEFAULT '0',
`skill_menu` varbinary(150) NOT NULL DEFAULT 'ÿÿÿÿ\0\0\0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ',
`pvp_mod` tinyint(1) DEFAULT '0',
`inventory` varbinary(3024) NOT NULL,
`equipped_lasers` varbinary(955) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0',
`boni` varbinary(955) NOT NULL,
`open_application` tinyint(1) NOT NULL DEFAULT '0',
`clan` varchar(16) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
为了便于阅读,我删除了一些条目,希望你能理解。
在四处搜索了一段时间后,我发现显然没有人需要问同样的问题,这意味着我是一个人。我试图手动查询结构,并将默认值正确地写出来,作为十六进制字符串(使用x'hextuff'),这就是我首先将它们输入数据库的方式 要获取我使用的列的架构,请执行以下操作:
p_connection.GetSchema("Columns");
其中,p_连接
是一个MySqlConnection
这将返回一个数据表,我正在读取该数据表以计算列的默认值。
列\u DEFAULT
条目提供的输出与仅通过mysqldump导出数据的输出完全相同。所以我想我需要继续,并尝试将这些乱七八糟的字母和字符转换成格式正确的十六进制字符串。
在我这样做之后,我意识到大多数默认值都被截断了,或者根本就错了(它们与phpMyAdmin在表的“结构”选项卡中显示的相同,只是转换为十六进制,而phpMyAdmin显示的不是实际的默认值)(插入空行并查看默认值即可轻松验证)。 我反复检查并确认我没有改变
COLUMN\u DEFAULT
的输出,我也没有
由于这个问题纯粹围绕着表结构(如中所示,列的默认值),而不是围绕着我正在运行任何算法的任何特定数据,因此我不认为提供特定数据在这里有帮助,所以我将省略这一点
有没有一种方法可以在MySQL中检索表中列的默认值,而不让它们在我背后被自动错误地转换为字符串
到目前为止,我正在考虑一种解决方法,我只需在表中插入一个元素而不带任何参数,这样所有值都是默认值。然后我可以重新加载该元素并检查它的值,这些值都应该是默认值。
我的问题是,将此用作导出方法会很糟糕,因为它不仅会导致不必要的加载,还会增加可能的AUTO\u INCREMENT
列,只是为了计算默认值。
在您提问之前:我已经查看了tableName的显示完整列
,它的行为与我加载列默认值的方法完全相同
最好的问候如果您需要以不强制将列的值转换为ASCII的方式检索列的值,您可以对信息架构执行此查询。
显示完整列
是查询此表的快捷方式。重要的是能够在此处将列的默认值
编码为十六进制
SELECT COLUMN_TYPE,
HEX(COLUMN_DEFAULT)
FROM information_schema.Columns
WHERE table_schema <> 'information_schema'
AND COLUMN_TYPE LIKE '%ob'
选择列类型,
十六进制(默认列)
从信息_schema.Columns
其中表\u架构“信息\u架构”
和列类型,如“%ob”
显然,您将使用适合您的表的
WHERE
子句。显然,保存在information\u schema.Columns下的值有缺陷(或者我认为是这样)
通过检索默认值
从tableName中选择DEFAULT(columnName)
返回正确完整的值
致以最诚挚的问候您好,感谢您的快速回答。我运行了“从信息_schema.COLUMNS中选择十六进制(列_默认值),其中表_NAME='users'”它返回了与我自己将trippy怪异默认值转换为十六进制的方法相同的截断错误结果。我在表中创建了另一个空条目,以验证这些结果是否确实错误。创建条目的值默认为正确的值。