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;