mysql 如何使用 LOAD DATA INFILE 导入中文数据
目录
中文乱码问题
使用 LOAD DATA INFILE 导入中文数据时经常遇到乱码,即使已将数据转换为 utf8 也无法解决。问题原因:LOAD DATA INFILE 需要通过 CHARACTER SET 指定数据文件的编码方式。
导入示例
LOAD DATA LOCAL INFILE '/var/log/ppm/userlog/httplog-2011-05-06-14.sql'
INTO TABLE user_action
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY '/'
LINES TERMINATED BY '\n'
(dload_type, content_name, server, infohash, file_len, ppc_url, user_ip, start_time, end_time, bytes_download);
关键是加上 CHARACTER SET utf8 指定数据文件编码。
中文乱码完整解决方案
原因分析
MySQL 中文乱码通常由以下原因导致:
- server 本身设定问题(停留在 latin1)
- table 的语系设定问题(character 和 collation)
- 客户端程序(如 php)的连线语系设定问题
建库建表时设定编码
-- 创建数据库
CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
-- 创建表
CREATE TABLE `database_user` (
`ID` varchar(40) NOT NULL default '',
`UserID` varchar(40) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
修改现有库表的编码
-- 查看默认编码格式
show variables like "%char%";
-- 修改库编码
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 修改表编码
ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 设置连接编码
set names utf8;
UTF-8 编码导入
# 确保数据文件编码为 UTF-8
set names utf8;
LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb;
GBK 编码导入
# 对于 GBK/GB2312 编码的数据
set names gbk;
ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb;
网页显示编码
- 将网站编码设为 utf-8,可兼容世界上所有字符
- 或在 MySQL 连接时加入编码参数:
?useUnicode=true&characterEncoding=utf-8 - 在网页代码中加上
SET NAMES utf8或SET NAMES gbk指令
重要提示
- UTF-8 数据不要导入 GBK 数据库,GBK 数据不要导入 UTF-8
- DOS 不支持 UTF-8 的显示,建议在 Linux 上进行导入操作
- 强烈建议统一使用 UTF-8 编码