【发布时间】:2015-04-16 17:40:58
【问题描述】:
这很简单。
我有一个使用 DEFAULT CHARSET=utf8; 运行表的数据库; 排序规则设置为 utf8_general_ci。
一切正常。使用此数据库的应用程序可以保存从普通话(中文)到瑞典语的任何内容,一切都很好。
但是。 db 有以下设置。
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/share/mysql/charsets/
如您所见,由于未知原因,数据库将 character_set_database 和 character_set_server 设置为 latin1。
这不会对运行它的应用程序造成问题,所以我们在那里很好,但是每当我们导出和导入时,都会将所有 charachter_set_* 变量设置为 utf8 或 utf8mb4(这似乎成为新常态),这使我们不得不为与数据库的每个会话进行额外的 SET NAMES 查询,即它既昂贵又烦人。
有什么方法可以在不破坏数据或干扰正在运行的应用程序的情况下解决这个问题?
考虑到你想在它上面运行一个全局应用程序,当涉及到字符设置时,MySQL 的适当设置是什么,我在哪里设置它以便它不仅坚持会话而且永远坚持(我猜在我的.cnf)。
谢谢。
编辑
从 export.sql 文件的开头添加值。 我使用以下行导出
mysqldump --opt --u root -pPassword dbName | gzip > database.sql.gz
-- 服务器版本 5.6.21-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `so_and_so_blabla`
...
编辑 2
从 SELECT col, hex(col) FROM table 添加输出。 请注意,这在原始数据库和导出中都可以正常工作,因为我在导入数据的数据库中使用 SET NAMES latin1 在发出查询之前。
Europas Länder 4575726F706173204CC383C2A46E646572
【问题讨论】:
标签: mysql utf-8 character-encoding mysqldump