mySql:如何创建未知数据类型的表?

问题描述 投票:0回答:2

我希望您能帮助我解决一些我已经搜索了很多但尚未找到答案的问题。 正如问题的标题所述,我正在尝试在 mySql 数据库中创建一个表,其中我不知道列的数据类型。基本上,我使用 php 从 csv 文件在数据库中创建新表。第一行包含列名称。我知道这是可以做到的,因为我在 phpMyAdmin 中看到过它,我可以选择一个 csv 文件并使用第一行生成表列名称,并且我不必指定每列的数据类型,

到目前为止,这是我的 php 代码:

$databaseName="myDatabase";
mysql_connect("localhost","xxxxxx","xxxxxxxx");
mysql_select_db($databaseName);


for($i = 0; $i < count($newFiles); $i++){//traverse the table that contains the file names
         $content = file($newFileLocation.$newFiles[$i]);

        //First line: $content[0];
        $firstLine=$content[0];//save first line which are the column names
        //echo  $firstLine;
        $tableName= str_replace('.txt','', $newFiles[$i]);//remove the .txt to use for table name
        //echo $tableName."\n";

        echo "\n\ncreating tables\n\n";
        /*mysql_query("load data local infile '$newFiles[$i]' 
               into table $tableName
                   fields terminated by ','
                   lines terminated by '\n'
                   ($firstLine) "); */


        mysql_close();
}
php mysql csv types
2个回答
1
投票

MySQL 中没有“未知”数据类型(也许 blob 类型与此最相似)。

如果您确实需要仅根据名称自动定义表字段,并且不知道将在其中存储哪种类型的数据,请将它们创建为 blob 或文本,并在存储值时创建由其实际类型制成的文本表示形式作为标题加上值的文本表示形式。

也许你根本不需要它。检查使用 PHP 获取 CSV 文件的第一行并使用数据创建 MySQL 表,也许您会在那里找到响应。


0
投票

这是问题的解决方案。首先,我们使用文件的第一行来保存列名称(以便我们知道如何创建表)。我们将其保存在一个字符串中,然后根据逗号字符将它们分开。 之后,我们获取包含值的文件的第二行。我们将该行存储到一个字符串中,并根据逗号字符将字符串分隔为不同的值。我们将使用它来识别每列的类型。

所以,这就是代码。

$databaseName="myDatabase";
mysql_connect("localhost","xxxxxx","xxxxxxxx");
mysql_select_db($databaseName);


for($k = 0; $k < count($newFiles); $k++){//traverse the table that contains the file names
            $content = file($newFileLocation.$newFiles[$k]);

            //First line: $content[0];
             $firstLine=$content[0];
             $secondLine=$content[1];   
            //echo $firstLine."\n";
            $firstLine = str_replace("\r\n",'',$firstLine);
            $colNames=explode(',',$firstLine);
            $fieldList = explode(',',$secondLine);

            $dataType="";
            for($i = 0; $i < count($fieldList); $i++){
                if (is_numeric($fieldList[$i])){
                        if (strpos($fieldList[$i],'.') == false){
                            $fieldList[$i] = (int)$fieldList[$i];
                       }else{
                            $fieldList[$i] = (float)$fieldList[$i];
                        }
                    }

                switch(gettype($fieldList[$i])) {
                        case 'integer':
                            $typeInfo = 'int(11)';
                            break;
                        case 'float':
                        case 'double':
                                $typeInfo = 'float';
                                break;

                        case 'string':
                                $typeInfo = 'varchar(80)';
                            break;
                        default:
                                $typeInfo = 'varchar(80)';
                                break;
                        }

                if(gettype($fieldList[$i]) != NULL) {
                    $dataType= $dataType.'`'.$colNames[$i].'` '." ".$typeInfo.' NOT NULL';
                    if(($i)!=count($fieldList)-1){
                        $dataType= $dataType.",";
                    }
                }
            }   //end of for loop


             $tableName= str_replace('.txt','', $newFiles[$k]);
             //echo $tableName."\n";

            //
                //echo "\n".$dataType."\n";
                $succ=mysql_query("CREATE TABLE `$tableName` ($dataType)");
                if($succ)
                    echo "Table ".$tableName." was created Succesfully \n";

                //echo $databaseName;

                 $loadsql = 'LOAD DATA LOCAL INFILE "'.$newFileLocation.$newFiles[$k].'" INTO TABLE `'.$tableName.'` FIELDS TERMINATED BY ","  IGNORE 1 LINES ('.$firstLine.')';
                 mysql_query($loadsql);     




        }//end of for loop


     mysql_close();
© www.soinside.com 2019 - 2024. All rights reserved.