我正在设置一个新的MySQL数据库,并通过提供给我的默认设置,我惊讶地发现它使用了各种字符集/排序规则。
SHOW VARIABLES LIKE '%character_set%';
SHOW VARIABLES LIKE '%collation%';
产生
________________________________________________
| | |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | latin1_swedish_ci |
|______________________________________________|
在这些设置中组合使用latin1和utf8会有风险吗?我一直认为,通过在任何地方使用相同的(最好是UTF-8 / Unicode),可以避免潜在的问题。
答案 0 :(得分:4)
是的,你可能会遇到混合字符集的麻烦,清理它会很痛苦。风险在于您将使用latin1编码声明一个表,并且某些应用程序将尝试在其中存储utf8代码。结果很乱。
如果发生这种情况,请阅读http://www.mysqlperformanceblog.com/2013/10/16/utf8-data-on-latin1-tables-converting-to-utf8-without-downtime-or-double-encoding/以获取控制数据的正确方法。如果这对您来说听起来有点复杂和危险,那么您就明白了! : - /
但首先避免混乱要好得多。从第一天开始就到处使用utf8
。如果您需要支持所有亚洲语言,请使用utf8mb4
。
例外:如果你知道永远不需要存储国际符号的字符串,例如一串十六进制数字,那么你可以为MySQL表中的各列声明字符集ascii
。
但是使用utf8作为数据库和表级别的默认值,以及MySQL连接以及应用程序,Apache,HTTP等的默认值。