如何使MySQL正确处理UTF-8

时间:2008-10-14 18:09:31

标签: mysql utf-8

a question I asked yesterday的回复之一表明我应该确保我的数据库能够正确处理UTF-8字符。我如何用MySQL做到这一点?

14 个答案:

答案 0 :(得分:76)

更新:

简短回答 - 您几乎应该始终使用utf8mb4字符集和utf8mb4_unicode_ci整理。

改变数据库:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

见:

原始答案:

MySQL 4.1及更高版本的默认字符集为UTF-8。您可以在my.cnf文件中对此进行验证,请务必设置 客户端和服务器(default-character-setcharacter-set-server)。

如果您有要转换为UTF-8的现有数据,请转储您的数据库,然后将其导回为UTF-8,确保:

  • 在查询/插入数据库之前使用SET NAMES utf8
  • 在创建新表时使用DEFAULT CHARSET=utf8
  • 此时您的MySQL客户端和服务器应该是UTF-8(请参阅my.cnf)。记住你使用的任何语言(如PHP)也必须是UTF-8。某些版本的PHP将使用自己的MySQL客户端库,这些库可能不支持UTF-8。

如果您确实要迁移现有数据,请记得先备份!当事情没有按计划进行时,会发生很多奇怪的数据!

一些资源:

答案 1 :(得分:38)

要将此作为“永久性”,请my.cnf

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

要检查,请转到客户端并显示一些变量:

SHOW VARIABLES LIKE 'character_set%';

验证它们全部是utf8..._filesystem除外,它应该是binary..._dir,它们指向MySQL安装中的某个位置。

答案 2 :(得分:30)

MySQL 4.1及更高版本有一个默认字符集,它调用utf8但实际上只是UTF-8的一个子集(只允许三字节字符和更小字符)。

如果您需要"完整"请使用utf8mb4作为您的字符集UTF-8。

答案 3 :(得分:19)

答案简短:在4个地方使用utf8mb4

  • 客户端中的字节数为utf8,而不是latin1 / cp1251 / etc.
  • 建立客户端与MySQL的连接时,
  • SET NAMES utf8mb4或等效的东西
  • 所有表/列上的
  • CHARACTER SET utf8mb4 - 严格为ascii / hex / country_code / zip_code / etc的列除外。
  • 如果您要输出HTML,请
  • <meta charset charset=UTF-8>。 (是的拼写在这里有所不同。)

More info;
UTF8 all the way

上述链接提供了“解决所有问题需要详细的规范答案”。 - 这个论坛有一个空间限制。

修改

除了CHARACTER SET utf8mb4包含“全部”世界角色之外,COLLATION utf8mb4_unicode_520_ci可以说是“最好的全能”整理使用。 (对于那些希望使用这些语言的细微差别的人,还有土耳其语,西班牙语等。)

答案 4 :(得分:4)

charset是数据库(默认)和表的属性。 你可以看看(MySQL命令):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

换句话说;检查数据库字符集或更改它很容易:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;

答案 5 :(得分:2)

我遵循了Javier的解决方案,但我在my.cnf中添加了一些不同的行:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

我在这里找到了这个想法:http://dev.mysql.com/doc/refman/5.0/en/charset-server.html在页面底部的第一个/唯一用户评论中。他提到 skip-character-set-client-handshake 具有一定的重要性。

答案 6 :(得分:2)

要将数据库本身的字符集编码更改为UTF-8,请在mysql&gt;处键入以下命令:提示。 USE ALTER DATABASE ..将DBNAME替换为数据库名称:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

这是此问题How to convert an entire MySQL database characterset and collation to UTF-8?

的副本

答案 7 :(得分:0)

这些tips on MySQL and UTF-8可能会有所帮助。不幸的是,它们并不构成一个完整的解决方案,只是常见的问题。

答案 8 :(得分:0)

database collation设为UTF-8 然后将table collation应用于数据库默认值。

答案 9 :(得分:-1)

您的答案是您可以通过MySql设置进行配置。在我的答案可能是一些脱离背景的事情,但这也知道对你有帮助。
  如何配置Character SetCollation

  

对于使用默认MySQL字符集存储数据的应用程序   和排序规则(latin1, latin1_swedish_ci),没有特殊配置   应该是需要的。如果应用程序需要使用数据存储   不同的字符集或排序规则,您可以配置字符集   信息有几种方式:

  • 为每个数据库指定字符设置。例如,应用程序 使用一个数据库可能需要utf8,而应用程序则需要utf8_general_ci 使用另一个数据库可能需要sjis。
  • 在服务器启动时指定字符设置。这会导致服务器 为所有不生成其他应用程序的应用程序使用给定的设置 安排。
  • 如果您构建MySQL,请在配置时指定字符设置 来源。这会导致服务器使用给定的设置 应用程序,无需在服务器启动时指定它们。

此处显示的示例用于设置utf8字符集的问题,此处还设置了排序规则以获得更多帮助( CREATE DATABASE new_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 排序规则`)。

指定每个数据库的字符设置

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

在服务器启动时指定字符设置

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

在MySQL配置时指定字符设置

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

要查看适用于您的连接的字符集和排序规则系统变量的值,请使用以下语句:

foreach ($file_url as $url) {
try {

    //rename the file... alternatively, you could explode on "/" and keep the original file name
    $filename = array_pop(explode("/", $url));

        if (@fclose(@fopen($url, "r"))) { //make sure the file actually exists
            copy($url, ABSPATH.$artDir.$filename);

            $siteurl = get_option('siteurl');
            $file_info = getimagesize(ABSPATH.$artDir.$filename);

            //create an array of attachment data to insert into wp_posts table
            $artdata = array();
            $artdata = array(
                'post_author' => 1, 
                'post_date' => current_time('mysql'),
                'post_date_gmt' => current_time('mysql'),
                'post_title' => $filename, 
                'post_status' => 'inherit',
                'comment_status' => 'closed',
                'ping_status' => 'closed',
                'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $filename)),
                'post_modified' => current_time('mysql'),
                'post_modified_gmt' => current_time('mysql'),
                'post_type' => 'attachment',
                'guid' => $siteurl.'/'.$artDir.$filename,
                'post_mime_type' => $file_info['mime'],
                'post_excerpt' => '',
                'post_content' => ''
            );

            $uploads = wp_upload_dir();
            $save_path = $uploads['basedir'].'/vehiclephotos/'.$vin.$filename;

            //insert the database record
            $attach_id = wp_insert_attachment($artdata, $save_path);

            //generate metadata and thumbnails
            if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
                wp_update_attachment_metadata($attach_id, $attach_data);
            }

            array_push($gallery_images,$attach_id);
            }

    }

    } catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

这可能是一个冗长的答案,但有各种方法,你可以使用。希望我的回答对您有所帮助。了解更多信息http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

答案 10 :(得分:-2)

SET NAMES UTF8

这就是诀窍

答案 11 :(得分:-2)

数据库连接到UTF-8

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());

答案 12 :(得分:-3)

将数据库连接设置为UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }

答案 13 :(得分:-3)

能够找到解决方案。按照http://technoguider.com/2015/05/utf8-set-up-in-mysql/

中的规定进行以下操作
XML