我今天注意到我们的数据库使用字符集“utf8 - UTF-8 Unicode”和排序规则“utf8_general_ci”,但里面的大多数表和列都使用CHARSET = latin1。我会遇到任何问题吗?
我问的原因是因为我们在两个数据库之间同步数据时遇到了很多问题。
答案 0 :(得分:2)
有关MySQL字符集的概述,请阅读http://mysqldump.azundris.com/archives/60-Handling-character-sets.html
服务器,模式/数据库和表没有字符集,它们只有向下继承的默认值(服务器到模式到表)。具有CHAR,VARCHAR或任何TEXT类型的列具有字符集,并且基于每个列执行此操作。如果没有为它们定义特定的字符集,它们将从表继承。
所有这些对象的继承都发生在对象创建时。
具有字符集的另一件事是连接。由于连接是服务器了解客户端的集合,因此连接的字符集应设置为您在客户端中使用的任何字符集。
然后,MySQL将在列的字符集和连接的字符集之间正确转换。通常没有问题。 PEOPLE最常见的问题是服务器,即将连接的字符集设置为与客户端实际发送或使用的不同。这可以在运行时通过发送命令SET NAMES ...
作为连接设置的第一件事来完成,在这里指定正确的东西是非常重要的。
如果你这样做,例如将latin1数据发送到SET NAMES latin1
的连接,将数据存储到latin1列将不会转换数据,而将数据存储到utf8列将转换你的latin1变音符号(ö) = F6)到磁盘上的utf8变音符号(ö= C3 B6)。如果连接设置正确,读取将透明地转换回来。
在您的设置中,如果您的连接是SET NAMES utf8
并且您要将数据发送到latin1列,则只能存储可以用latin1表示的数据。如果您尝试将日语平假名存储在这样的latin1列中,则会有数据截断和数据截断警告。
答案 1 :(得分:0)
我使用MySQL charset的经验不是100%的字符串功能排序。将UTF-8中的所有东西放在安全的一边会更好。
我认为这取决于你实际存储在那些列中的内容。如果在带有latin-1字符集的列中存储UTF-8多字节字符,则可能会遇到排序问题。但是,只要只有EN / US字符就可以了。
答案 2 :(得分:0)
如果有可能存储“国际”文本(即非拉丁字符),您将遇到问题。
如果我了解您正确发布的内容,则表示数据库中新表的默认为UTF-8,但您的现有表使用拉丁语 - 1。这可能是个问题。取决于您的数据,如上所述。