检索MySQL默认值

时间:2014-01-24 20:15:26

标签: c# mysql

我正在使用 MySqlConnect 进行.Net(MySql.Data.dll声明版本6.7.4.0)并使用 phpMyAdmin运行本地 MySQL服务器 via XAMPP phpMyAdmin 似乎是版本 4.0.9 MySQL 本身位于版本 5.6.14 - MySQL社区服务器(GPL)。

我遇到的问题与我指定为二进制值的默认值有关。 我试图导出我的数据库,经过几分钟的试错,设法使用mysqldump将我的数据导出为二进制十六进制字符串。 问题是,虽然导出的sql文件的INSERT语句使用了我想要的非常好的和整齐的十六进制字符串,但结构的DEFAULT说明符不是。

以下是一个例子:

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'hexstuff'),这就是我首先将它们放入数据库的方式。

获取我使用的列的架构:

p_connection.GetSchema("Columns");

p_connection是MySqlConnection。

这将返回我正在阅读的DataTable,以确定列的默认值。 COLUMN_DEFAULT条目给出了与通过mysqldump导出数据完全相同的输出。
所以我想我需要继续尝试将那些乱七八糟的字母和字符转换成格式正确的十六进制字符串 在我完成之后,我意识到大多数默认值都被截断或者完全错误(它们与表格的phpMyAdmin的“结构”选项卡中显示的相同,只是转换为十六进制,以及 phpMyAdmin 显示的不是实际的默认值(通过插入空行并查看默认值可以轻松验证))。 我进行了两次和三次检查,我没有改变COLUMN_DEFAULT的输出而我没有。

由于这个问题完全围绕表结构(如列的默认值),而不是我运行任何算法的任何特定数据,我不认为提供特定数据有助于在这里,所以我会把它留下来。

有没有办法在MySQL中的表上检索列的默认值,而不会自动将它们背后错误地转换为字符串?

截至目前,我正在考虑一种解决方法,我只是在没有任何参数的情况下将一个元素插入到表中,因此所有值都是默认的。然后我可以重新加载该元素并检查它具有的值,这些值都应该是默认值。 我的问题是,使用它作为导出方法会很糟糕,因为它不仅会导致不必要的负载,还会增加可能的AUTO_INCREMENT列,只是为了找出默认值。 在你问之前:我看过SHOW FULL COLUMNS FOR tableName,它的行为与我加载列默认值的方法完全相同。

最好的问候

2 个答案:

答案 0 :(得分:0)

如果需要以不将其强制转换为ASCII的方式检索列的值,则可以对信息模式执行此查询。 SHOW FULL COLUMNS是查询此表的快捷方式。重要的是能够在这里将COLUMN_DEFAULT编码为十六进制。

 SELECT COLUMN_TYPE,
    HEX(COLUMN_DEFAULT) 
   FROM information_schema.Columns 
  WHERE table_schema <> 'information_schema'
    AND COLUMN_TYPE LIKE '%ob'

显然,您将使用适合您桌子的WHERE条款。

答案 1 :(得分:0)

显然,在information_schema.Columns下保存的值是错误的(或者我认为,无论如何)。

通过检索默认值 SELECT DEFAULT(columnName) FROM tableName 会返回正确且完整的值。

最好的问候