2

我正在检查 MySQL 中具有奇怪列名的表。我想将列的名称更改为不奇怪。我不知道该怎么做。

首先,如果我先做

SET NAMES utf8;
DESC `tblName`;

我明白了

| Ԫ                           | varchar(255)  | YES  | MUL | NULL    |                |

相反,做

SET NAMES latin1;
DESC `tblName`;

结果是

| ?                           | varchar(255)  | YES  | MUL | NULL    |                |

很公平 - 这让我认为列名只是一个 latin1 问号。但是这个声明不起作用:

mysql> ALTER TABLE `tblName` CHANGE COLUMN `?` `newName` VARCHAR(255);
ERROR 1054 (42S22): Unknown column '?' in 'tblName'

所以我去 information_schema 表获取一些信息:

mysql> SELECT column_name, HEX(column_name), ordinal_position FROM information_schema.columns WHERE table_schema = 'myschema' AND table_name = 'tblName' ;
| ?                           | D4AA                                                   |               48 |

我查了这个十六进制点,假设我查对了(这可能不是真的),我确定这个字符是“풪”,即“hangul sylable pweoj”。所以我在alter table语句中尝试了这一点,但无济于事:

ALTER TABLE `tblName` change column `풪` `newName` VARCHAR(255);

所以这就是我卡住的地方。

4

2 回答 2

3

我想出了一种方法来做到这一点(但我想知道是否有更好的解决方案?)

我做了一个SHOW CREATE声明:

mysql> SHOW CREATE TABLE `tblName`;
...
`Ԫ` varchar(255) DEFAULT NULL,

我查找了有问题的列,该列打印得很奇怪(您在上面看到的内容与它不太匹配)。关闭反引号不可见。但是我突出显示了可见的内容并将其粘贴到我ALTER TABLE的中,最终解决了这个问题。

于 2013-10-14T17:08:41.953 回答
2

我相信Ԫ(框中的问号)实际上已显示,因为您的系统在该代码点没有字体。从您的 `hex(column_name)' 我们可以看到该值为 xD4AA,即UTF-8值。这转换为 Unicode 点 052a,我的 Windows 框中也没有该字体。

将 char 设置为 latin1,仅仅意味着 Mysql 无法将该 char 转换为 latin1/cp1252 值,因此将其替换为“?”。(xD4AA 可以很容易地转换为两个 cp1252 字符,“Ôª”。出于某种原因,Mysql 选择不这样做。也许它知道原始编码?)

现在,如何重命名列?它应该像你所说的那样简单ALTER TABLE CHANGE COLUMN等。但是,Mysql 控制台似乎不能很好地处理非 ASCII 字符,尤其是 UTF-8 中的可变长度字符。

解决方案是将 SQL 作为参数从 Bash 传递给 mysql。例如(在粘贴 Ԫ 之前确保终端翻译为 UTF-8):

 mysql --default-character-set=utf8 -e "ALTER TABLE test change column Ԫ test varchar(255);" test
于 2013-10-15T20:12:36.250 回答