如何从mysql字段名称中删除特殊字符

时间:2014-02-07 16:34:57

标签: mysql sql phpmyadmin escaping special-characters

在标题行中导入包含一些特殊字符(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。有什么建议吗?

2 个答案:

答案 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命令,它运行正常。