mySQL 字符集

标签 mysql character

我今天注意到我们的数据库使用字符集“utf8 -- UTF-8 Unicode”和排序规则“utf8_general_ci”,但里面的大多数表和列都使用 CHARSET=latin1。我会遇到任何问题吗?

我问的原因是因为我们在两个数据库之间同步数据时遇到了很多问题。

最佳答案

有关 MySQL 字符集的概述,请阅读示例 http://mysqldump.azundris.com/archives/60-Handling-character-sets.html

服务器、模式/数据库和表没有字符集,它们只有向下继承的默认值(服务器到模式到表)。 CHAR、VARCHAR 或任何 TEXT 类型的列都具有字符集,并且以每列为基础进行设置。如果没有为它们定义特定的字符集,它们将从表中继承。

所有这些对象的继承发生在对象创建时。

具有字符集的另一件事是连接。由于连接是服务器了解客户端信息的集合,因此连接的字符集应设置为您在客户端中使用的任何字符集。

MySQL 然后将在列的字符集和连接的字符集之间正确转换。通常没有问题。

人们最常遇到的问题是对服务器撒谎,即将连接的字符集设置为与客户端实际发送或使用的字符集不同的字符集。这可以在运行时通过发送命令 SET NAMES ... 作为连接设置的第一件事来完成,在这里指定正确的内容非常重要。

如果您这样做,例如将 latin1 数据发送到一个已被 SET NAMES latin1 的连接中,将数据存储到 latin1 列将不会转换数据,而将数据存储到 utf8 列将转换你的 latin1 变音符号 (ö = F6) 变成磁盘上的 utf8 变音符号 (ö = C3 B6)。如果连接设置正确,阅读将透明地转换回来。

在您的设置中,如果您的连接是 SET NAMES utf8 并且您正在将数据发送到 latin1 列,则只能存储可以在 latin1 中表示的数据。例如,如果您尝试在这样的 latin1 列中存储日文平假名,将会出现数据截断和数据截断警告。

关于mySQL 字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5552763/

相关文章:

mysql - 无法为简单的 CASE 语句指定 ALIAS

SQL:尝试避免使用某些元素的名称

mysql - 在mysql中定义相似字符

Emacs 口齿不清 : Translate characters to standard ASCII transcription

java - JPA连接表查询

MYSQL多个WHERE IN导致LIKE被忽略(?)

php - mysql : Products which satisfies category conditions

mysql - 将所有 5 个表值相加以形成新表?

带有西类牙字符的 Git 字符编码

Excel VBA - 替换非英文字符