【问题标题】:mySQL Character SetsmySQL 字符集
【发布时间】:2011-04-05 13:39:40
【问题描述】:

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

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

【问题讨论】:

    标签: mysql character


    【解决方案1】:

    有关 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 列中,则会出现数据截断和数据截断警告。

    【讨论】:

      【解决方案2】:

      我对 MySQL 字符集的混乱体验并不是 100% 的字符串功能排序。为了安全起见,最好将所有内容都使用 UTF-8。

      我认为这取决于您在这些列中实际存储的内容。如果您将 UTF-8 多字节字符存储在具有 latin-1 字符集的列中,您可能会遇到排序问题。但只要只有 EN/US 字符就可以了。

      【讨论】:

        【解决方案3】:

        如果有可能存储“国际”文本(即非拉丁字符),您将遇到问题。

        如果我理解您发布的内容正确,这意味着您的数据库中新表的 默认 是 UTF-8,但您的 现有 表使用 latin- 1.那可能是个问题。如上所述,取决于您的数据。

        【讨论】:

          猜你喜欢
          • 2011-10-15
          • 2010-09-20
          • 1970-01-01
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多