MySQLdb没有将表设置为UTF-8

时间:2017-09-22 17:26:23

标签: python mysql django-models utf-8 iso-8859-1

我指定db应该是utf8mb4

CREATE DATABASE IF NOT EXISTS MY_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后我运行一个脚本来创建表并从一些平面文件中填充表。这些文件包含latin1个字符,并使用latin1编码打开。 db的表在models.py个文件中指定,因为这是一个Django应用程序。 Django文档说你像我在创建数据库时那样指定编码。

数据加载,但在MySQL Workbench中,表格似乎是' latin1':

SELECT
`tables`.`TABLE_SCHEMA`,
`tables`.`TABLE_NAME`,
`tables`.`TABLE_COLLATION`,
`collations`.`character_set_name`
FROM
`information_schema`.`TABLES` AS `tables`,
`information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
`tables`.`table_schema` = DATABASE()
AND `collations`.`collation_name` = `tables`.`table_collation`
;

query output

为什么表格显示为latin1,如何制作utf8mb4

3 个答案:

答案 0 :(得分:0)

尝试使用以下查询。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

答案 1 :(得分:0)

原来在两个地方调用了#define kEcardURL @"https://example.com/mobile/services/ecard/" - (void)doSomething { //Params Configuration NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys: [oauth.userData valueForKey:@"wsuserid"], @"token", nil]; NSString *path = @"fotoCartao"; NSData* params = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kEcardURL, path]]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [urlRequest setHTTPBody:params]; NSURLSessionDataTask *dataTask = [[self session] dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if ([data length] > 0 && error == nil) { if ([httpResponse statusCode] == 200) { //do stuff } } }]; [dataTask resume]; } } - (NSURLSession *)session { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // Session Configuration NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; // Initialize Session _session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; }); return _session; } 命令。我正在编辑第二个,因为数据库已经存在,所以没有使用它。当我将CREATE DATABASE...添加到第一个CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;命令时,表格得到了正确的字符集。

答案 2 :(得分:0)

桌子的字符集和整理并不重要;它只是添加新列时使用的默认值。重要的是列的设置。用这个来找出:

SHOW CREATE TABLE mytable

(有一种方法可以使用information_schemaCOLUMNS集中获取信息。)

如何加载数据?如果您(或代表您使用Django)使用LOAD DATA INFILE,那么它是否有CHARACTER SET子句?它需要说明数据的编码是什么。这 not 需要与数据将进入的列的字符集相同。

Django进一步注意到:

DATABASES = {     'default':{         'ENGINE':'django.db.backends.mysql',         ...         'OPTIONS':{                     'charset':'utf8mb4',                     'use_unicode':是的,},     }, } 的my.cnf:

的[mysqld] 字符集服务器= utf8mb4 默认自动分页= utf8mb4_unicode_ci

[客户] 默认字符集= utf8mb4

Python注意到:http://mysql.rjweb.org/doc.php/charcoll#python