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 |

私はこの hex point を調べました。正しく調べたと仮定すると (これは正しくない可能性があります)、この文字は「ハングル音節 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値です。これは、Windows ボックスにもフォントがない Unicode ポイント 052a に変換されます。

文字セットを latin1 に設定すると、Mysql がその文字を latin1/cp1252 値に変換できなかったため、「?」に置き換えられました。(xD4AA は 2 つの cp1252 文字 "Ôª" に簡単に変換できます。何らかの理由で Mysql は変換しないことを選択しました。おそらく、元のエンコーディングを知っていたのでしょうか?)

では、列の名前を変更する方法は? etc などで言うのと同じくらい単純なはずです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 に答える