即使数据库本身、客户端、连接、将数据加载到表中的文件等都是 utf8,我在让表正确显示 utf8 时遇到问题。要么我错过了一些东西,其中一件事情不成立,要么我在这里错过了更大的东西。不,这一切都很好,正如我后来所做的十六进制测试所示。将其余部分留给其他偶然发现此问题的人,因为我想它可以帮助解决其他问题?不知道。
mysql> show variables like "char%";
+--------------------------+--------------------------+
| Variable_name | Value |
+--------------------------+--------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\share\charsets\ |
+--------------------------+--------------------------+
8 rows in set (0.00 sec)
在我看来很好。character_set_server 是 latin1,但即使使用[mysqld] 下的 my.ini或在 my.ini中,我似乎也无法更改它。可能是问题所在,如果是这样,我猜我可能必须更改 Windows 本身的某些内容?事实证明,默认情况下,Windows 有多个 .ini,它不一定最后加载到 my.ini 中。只是必须确保将其更改为正确的。其他相关位以防其他错误跳出:character-set-server=utf8
character_set_server=utf8
CREATE TABLE `vocab` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kanji` varchar(250) DEFAULT NULL,
`hiragana` varchar(250) DEFAULT NULL,
`english` varchar(250) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我在上面显示的数据库中创建了这个表,然后我使用LOAD DATA INFILE
命令加载了一个 csv。LOAD DATA INFILE 在其任何步骤或类似的过程中是否转换为另一个字符集?它没有,文件是 100% 好的。
无论如何,这是我在命令行中得到的:
mysql> select kanji,hiragana,english from vocab where id=2;
+-------+----------+---------+
| kanji | hiragana | english |
+-------+----------+---------+
| 愛 | あい | love |
+-------+----------+---------+
1 row in set (0.00 sec)
是的,这些肯定是 utf8 字符,但不是正确的。尽管如此,我还是再次检查了完整性,并且 csv 实际上是 utf8。
编辑:做了一些进一步的测试
mysql> select hiragana, HEX(hiragana),LENGTH(hiragana),CHAR_LENGTH(hiragana) FR
M vocab where id=2;
+----------+---------------+------------------+-----------------------+
| hiragana | HEX(hiragana) | LENGTH(hiragana) | CHAR_LENGTH(hiragana) |
+----------+---------------+------------------+-----------------------+
| πüéπüä | E38182E38184 | 6 | 2 |
+----------+---------------+------------------+-----------------------+
1 row in set (0.04 sec)
至少长度与 char_length 的比较似乎也是正确的,因为它是 3:1。不仅如此,十六进制似乎也应该是平假名,这让我相信也许我正在使用的命令行客户端设置错误以显示它或其他什么?
此外,在浏览器中对其进行了测试,它正确显示了字符。这不是一个真正必要的步骤,因为十六进制已经讲述了足够多的故事,但是,嘿。
总结一下:
- 只是客户端的显示有问题。但是,我该如何解决呢?有没有办法修复它或者 MySQL 命令行客户端 5.5 只是不支持所有字符类型?