中文和日文字符无法与mysql配合使用

3

我有一个名为CHINESE的表,只有一列NAME
SHOW VARIABLES LIKE 'char%'的输出是:

+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | latin1                                                 |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | latin1                                                 |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.73-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+

当我运行此查询:INSERT INTO CHINESE VALUES ('你好'),值被插入。
但是,当我尝试执行此查询:SELECT * FROM CHINESE时,结果是:

+------+
| NAME |
+------+
| ??   |
+------+

SELECT HEX(NAME) FROM CHINESE的结果是:

+-----------+
| HEX(NAME) |
+-----------+
| 3F3F      |
+-----------+

我犯了哪个错误?


你的数据库中可能有实际上是UTF-8编码的数据,但服务器错误地将其视为Latin1编码。将连接设置为Latin1是否可以使其正确显示?由于Latin1是一个8位字符集,因此它可以存储UTF-8编码的数据,但当您尝试将其显示为实际的Latin1字符时,它会看起来混乱不堪。 - tadman
当我向数据库插入值时,实际值没有被持久化,而是持久化了“?”字符。当我切换到“latin1”并执行选择语句时,结果仍然相同。 - Devashish Dixit
但是,当我在'latin1'中插入值时,输出就正常。 - Devashish Dixit
你应该尝试将服务器、连接和所有内容都切换到utf8,创建一个新的数据库和测试表,在其中插入数据,看看是否可以正常工作。我认为你已经有了UTF-8数据,但服务器正在进行转换,就好像它是Latin1一样。 - tadman
2个回答

0

如果mysql版本大于等于5.5.3,请使用utf8mb4。

  1. 修改原始表
ALTER TABLE $tablename
  CONVERT TO CHARACTER SET utf8mb4 
  COLLATE utf8mb4_general_ci
  • 创建新表
  • CREATE TABLE $tablename (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    1. 修改列
    ALTER TABLE $tablename
        MODIFY $col1
        VARCHAR(191)
        CHARACTER SET utf8mb4;
    

    参考:Mysql文档:列字符集转换


    -2
    尝试以下更改字符集: SET NAMES 'big5';

    为什么我不能用'utf8'来做呢? - Devashish Dixit
    当我使用SET NAMES 'latin1'时,它可以工作。但是我想在这里使用'utf8'。 - Devashish Dixit
    UTF-8适用于主要由拉丁字母组成的文本。 - Mike Deluca
    我也希望它能够与拉丁字母一起使用。'big5' 对它们的支持效果如何? - Devashish Dixit
    我相信这只适用于亚洲字母。你的帖子没有明确说明你不想要亚洲字母,所以我提供了我给出的答案。 - Mike Deluca

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接