MySQL列名是一个奇怪的字符-如何更改它?

MySQL列名是一个奇怪的字符-如何更改它?,mysql,unicode,alter-table,Mysql,Unicode,Alter Table,我正在检查MySQL中有一个奇怪列名的表。我想将列的名称更改为不奇怪。我不知道该怎么做 首先,如果我先这么做 SET NAMES utf8; DESC `tblName`; 我明白了 相反,做 SET NAMES latin1; DESC `tblName`; 导致 | ? | varchar(255) | YES | MUL | NULL | | 很公平-这让我觉得列名只是一个拉丁文问号。但这句话

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

首先,如果我先这么做

SET NAMES utf8;
DESC `tblName`;
我明白了

相反,做

SET NAMES latin1;
DESC `tblName`;
导致

| ?                           | varchar(255)  | YES  | MUL | NULL    |                |
很公平-这让我觉得列名只是一个拉丁文问号。但这句话行不通:

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 |
我查了这个六角点,假设我查对了(可能不是真的),我确定这个字符是“풪" 这是“韩语音节pweoj”。所以我在alter table语句中尝试了这一点,但没有成功:

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

这就是我的困境所在。

我找到了一种方法来解决这个问题(但我想知道是否有更好的解决方案?)

我做了一个
SHOW CREATE
语句:

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

我查找了有问题的列,该列打印得很奇怪(你在上面看到的与它不太匹配)。结尾的回勾不可见。但我突出显示了可见的内容,并将其粘贴到我的
ALTER表中,最终解决了问题。

我相信
(方框中的问号)实际上是显示的,因为您的系统在该代码点没有字体。从您的“十六进制(列名)”中,我们可以看到该值是xD4AA,即UTF-8值。这转换为Unicode点052a,我的Windows框中也没有该字体

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

现在,如何重命名列?它应该像您所说的那样简单,使用
altertable CHANGE column
等。但是,Mysql控制台似乎不能很好地处理非ASCII字符,特别是UTF-8中的可变长度字符

解决方案是将SQL作为参数从Bash传递给mysql


是的,使用分隔标识符是处理这个问题的正确方法。我也会使用复制粘贴方法。你在哪里运行mysql客户端?Linux、Mac、Windows等?@AlastairMcCormack服务器在Debian上运行,我在Ubuntu上运行客户端。所以一切都是Linux。
mysql> SHOW CREATE TABLE `tblName`;
...
`Ԫ` varchar(255) DEFAULT NULL,
 mysql --default-character-set=utf8 -e "ALTER TABLE test change column Ԫ test varchar(255);" test