在做项目的时候发现一种奇葩的情况:1. 直接在mysql中插入中文,正常显示;2. 使用php接受用户输入的中文写入日志,正常显示;3. 使用php将用户输入的中文写入mysql,出现乱码;4. 同样的代码在本地运行,php把中文写入mysql,正常显示。搞了半天,终于弄明白了,谨记教训,不再犯。
概念
• 字符序(Collation)是指在同一字符集内字符之间的比较规则;
• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);
• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以 _ci (表示大小写不敏感case insensitive)、_cs(表示大小写敏感case sensitive)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,大小写不敏感,字符“a”和“A”是等价的;
MySQL字符集
• 系统变量:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集