在标题行中导入包含一些特殊字符(like carriage returns or line feeds)
的Excel表后,似乎phpMyAdmin实用程序通过在字段名称中插入这些字符来静默处理这种情况。
当我尝试将表格导入其他环境/工具(如数据集成器等)时出现问题。例如,列"Date Start"
已作为"Date\nStart"
导入到表中,带有LINE FEED在中间。
通过phpMyAdmin进行字段重命名操作失败,并显示以下错误:
**\#1054 - Unknown column 'Date Start' in 'mytable'**
显而易见的解决方法是手动编辑原始Excel文件(删除LF),然后像以前一样重新导入MySql中的表,但是我需要刷新模式,同时保留表中的数据。
接下来我在phpMyAdmin的一个SQL面板中尝试了这个(注意字段名称中的\ n ,VARCHAR(16)只是一个例子,DATETIME或INT也可以正常工作):
ALTER TABLE mytable CHANGE `Date\nStart` `Date Start` VARCHAR(16)
但是它再次出现错误#1054 - 'mytable'中的未知列'Date \ nStart'
我还检查了INFORMATION_SCHEMA数据库,但正如@Steve所述,它是一个只读数据库。
我在Win7桌面上使用MySql 5.5.32和phpMyAdmin 4.0.4.1。有什么建议吗?
答案 0 :(得分:0)
我认为由于权限问题你无法写信给INFORMATION_SCHEMA,但在阅读MySQL Manual之后我意识到这是预期的行为,如手册所述:
Although you can select INFORMATION_SCHEMA as the default database with a USE statement, you can only read the contents of tables, not perform INSERT, UPDATE, or DELETE operations on them.
要使用RENAME TABLE命令实现表重命名,首先运行select查询以查找需要更改的所有表,然后重命名它们,用空格字符替换carnage return。
要仅从表中重命名列,ALTER TABLE命令可与CHANGE COLUMN
参数一起使用,例如:
ALTER TABLE table_name CHANGE COLUMN 'Date\nStart' 'Date Start' DATETIME
我知道你已经说过这是你需要的命令,所以我自己先测试了这个,然后先选择表格然后运行ALTER TABLE命令,它运行正常。我正在使用命令行界面,所以问题可能在于phpMyAdmin - 你能确认它不是编码或转义\ n?
以下是我通过命令行测试并运行正常的方法:
SELECT COLUMN_NAME
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE TABLE_SCHEMA = 'test_345'
AND TABLE_NAME LIKE '%\n%';
ALTER TABLE test_table1 CHANGE COLUMN 'Date\nStart' 'Date Start' DATETIME;
如果您认为将来有用,可以将其中任何一个包含在例程中。
答案 1 :(得分:0)
首先,通过阅读MySql手册,您可以欣赏(或讨厌)命名规则允许的极大灵活性,可以在表格和列名称中找到特殊字符的详细信息。本手册页: https://dev.mysql.com/doc/refman/5.5/en/identifiers.html
在几次尝试转义CR字符后,我发现了一个可以在phpMyAdmin SQL窗格中运行的解决方案,我认为它也适用于命令行会话(没试过)。
如果你无意中在名称中创建或导入了带有CR的列,可以通过在SQL ALTER TABLE语句中的列名中键入ENTER键来修复它(你必须将反引号中的名称括在工作)。
示例 :要将不需要的“Date \ nStart”列名替换为“Date Start”,您应该输入(请注意,CR / Enter在第一行的末尾!):
ALTER TABLE
mybuggytable
更改`日期开始``日期开始`VARCHAR(16)
如上所述,您可以查看嵌入了此语句的CR的列:
USE INFORMATION_SCHEMA; SELECT * FROM
COLUMNS
WHERE COLUMN_NAME喜欢'%\ n%'
我在phpMyAdmin SQL窗格中输入了ALTER TABLE命令,它运行正常。