首先自己文笔不好。就不写口水话了。
第一点:先了解下面这句代码
select * from information_schema.`COLUMNS` t1 where TABLE_SCHEMA=database() and TABLE_NAME = 'hotelroomlist' //hotelroomlist表名称
查询当前表所有属性,运行结果为很多内容。我在下面只显示最关键的内容。其他的自己运行可以看看可以看到,很多能显示的都显示出来了。但是我在使用中必须把字段类型长度分别取出 比如:下图效果
(这个是最终效果)
所以上面查询数据库属性基本都都有。但是特殊类型(smallint,tinyint等等)都不能显示出长度。CHARACTER_MAXIMUM_LENGTH 这个属性就不能完全获取出就要对上面一句进行处理。
第一次写了以下内容
select ORDINAL_POSITION f_number, COLUMN_NAME f_column, DATA_TYPE f_datatype, if(CHARACTER_MAXIMUM_LENGTH is null,if(LOCATE('int',column_type)>0,REPLACE(REPLACE(column_type,'int(',''),')',''),0),CHARACTER_MAXIMUM_LENGTH) f_length, '' f_identity, IF(COLUMN_KEY='PRI','1','') f_key,IF(IS_NULLABLE='YES','1','') f_isnullable,COLUMN_DEFAULT f_default,case when COLUMN_COMMENT='' then COLUMN_NAME else COLUMN_COMMENT END f_remark from (
select * from information_schema.`COLUMNS` t1 where TABLE_SCHEMA=database() and TABLE_NAME ='hotelroomlist'
) t2 order by f_number
查询出来效果不太理想,但数据库中只是varchar int 类型的那么上面代码完全实用只是 像smallint这样的类型的无法分解出来
于是做了一个修改
select ORDINAL_POSITION number, COLUMN_NAME f_column, DATA_TYPE datatype, case WHEN CHARACTER_MAXIMUM_LENGTH is null
then ( case
WHEN LOCATE('smallint',column_type)>0
then REPLACE(REPLACE(column_type,'smallint(',''),')','')WHEN LOCATE('tinyint',column_type)>0
then REPLACE(REPLACE(column_type,'tinyint(',''),')','')WHEN LOCATE('bigint',column_type)>0
then REPLACE(REPLACE(column_type,'bigint(',''),')','')WHEN LOCATE('int',column_type)>0
then REPLACE(REPLACE(column_type,'int(',''),')','')else 0
END)elseCHARACTER_MAXIMUM_LENGTHEND length , '' identity, IF(COLUMN_KEY='PRI','1','') f_key,IF(IS_NULLABLE='YES','1','') isnullable,COLUMN_DEFAULT f_defaults,case when COLUMN_COMMENT='' then COLUMN_NAME else COLUMN_COMMENT END remark from(select * from information_schema.`COLUMNS` t1 where TABLE_SCHEMA=database() and TABLE_NAME ='hotelroomlist') t2order by number
又花了N个小时后修改成上面内容。本来感觉很好了。可是又遇到问题。在数据库中需要设置“无符号” 的东西,这个在数据库中比较常用。使用上面的一句类型后面会跟一个unsigned的标识所以还是不太满意
没办法又重新来过。又花了半小时想到用截取的方式来解决,于是下面是最终代码
select ORDINAL_POSITION number, COLUMN_NAME f_column, DATA_TYPE datatype,column_type type, case WHEN CHARACTER_MAXIMUM_LENGTH is null
then ( case
WHEN LOCATE('smallint',column_type)>0
then SUBSTRING(column_type FROM 10 FOR 1)WHEN LOCATE('tinyint',column_type)>0
then SUBSTRING(column_type FROM 9 FOR 1)WHEN LOCATE('bigint',column_type)>0
then SUBSTRING(column_type FROM 8 FOR 1)WHEN LOCATE('int',column_type)>0
then SUBSTRING(column_type FROM 5 FOR 1)else 0
END)elseCHARACTER_MAXIMUM_LENGTHEND length , '' identity, IF(COLUMN_KEY='PRI','1','') f_key,IF(IS_NULLABLE='YES','1','') isnullable,COLUMN_DEFAULT f_defaults,case when COLUMN_COMMENT='' then COLUMN_NAME else COLUMN_COMMENT END remark from(select * from information_schema.`COLUMNS` t1 where TABLE_SCHEMA=database() and TABLE_NAME = 'hotelroomlist') t2order by number
效果如下:
就为了把列类型中的长度单独提出来用了1天多时间。所以别嫌弃我前面给了一些感觉无用的东西。但是每个代码其实都可以可以使用只是只要别遇到特殊的字段类型就可以的
写出来是感觉网上,我一直没找到相关的内容,所以也为大家分享一下,免得花时间