mysql 中英文插入时,出现乱码无法插入的问题。
由于是Ubuntu的机器,mysql的配置文件是:/etc/mysql/my.cnf
设置了下配置文件my.cnf的编码为utf8:
[client]
default-character-set=utf8
#default-character-set=utf8 #这个太坑爹了,在mysql 5.+版本上设置,mysql直接启动不起来了。
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
#for php
skip-character-set-client-handshake
[mysql]
default-character-set=utf8
重启mysql 还是无法插入中文。
sudo /etc/init.d/mysql start/stop/restart
在网上搜索了半天,都是说经过上面的设置就搞定了,但是还是不行。于是直接手动修改使用的mysql数据库编码:
ALTER DATABASE buildtools DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
这样数据库的默认编码就成了utf8了,
通过下面命令可以查看当前数据库使用的编码情况:
SHOW CREATE DATABASE db_name;
show variables like 'collation%';
show variables like 'char%';
再删除之前创建的所有数据库,重新运行python manager syncdb 创建数据库,所有表就都是utf8编码了。
试着插入中文,结果还是无法插入,错误log有所变化:
Error:Warning: Incorrect string value: '\xE6\xB5\x8B\xE8\xAF\x95...' for column 'object_repr' at row 1
发现时django_admin_log的数据表没有不是utf8
show create table django_admin_log;
| django_admin_log | CREATE TABLE `django_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`action_time` datetime NOT NULL,
`user_id` int(11) NOT NULL,
`content_type_id` int(11) DEFAULT NULL,
`object_id` longtext,
`object_repr` varchar(200) NOT NULL,
`action_flag` smallint(5) unsigned NOT NULL,
`change_message` longtext NOT NULL,
PRIMARY KEY (`id`),
KEY `django_admin_log_6340c63c` (`user_id`),
KEY `django_admin_log_37ef4eb4` (`content_type_id`),
CONSTRAINT `content_type_id_refs_id_93d2d1f8` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
CONSTRAINT `user_id_refs_id_c0d12874` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 |
修改django_admin_log 表以及对应字段的编码
ALTER TABLE django_admin_log DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE django_admin_log MODIFY object_repr VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
ALTER TABLE django_admin_log MODIFY object_id longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
ALTER TABLE django_admin_log MODIFY change_message longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
show create table django_admin_log;
已经修改好了。。。
| django_admin_log | CREATE TABLE `django_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`action_time` datetime NOT NULL,
`user_id` int(11) NOT NULL,
`content_type_id` int(11) DEFAULT NULL,
`object_id` longtext COLLATE utf8_unicode_ci NOT NULL,
`object_repr` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`action_flag` smallint(5) unsigned NOT NULL,
`change_message` longtext COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `django_admin_log_6340c63c` (`user_id`),
KEY `django_admin_log_37ef4eb4` (`content_type_id`),
CONSTRAINT `content_type_id_refs_id_93d2d1f8` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
CONSTRAINT `user_id_refs_id_c0d12874` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
再插入中文,OK。
PS: mysql 批处理。
BEGIN;
DROP TABLE `admins_email`;
DROP TABLE `admins_buildrecord`;
DROP TABLE `admins_patchpackage`;
DROP TABLE `admins_channelpackage`;
DROP TABLE `admins_package`;
DROP TABLE `admins_channelstrategy`;
DROP TABLE `admins_channel`;
COMMIT;