我即将创建一个项目,其中包括一个支持多种语言的数据库,所以我决定使用UTF-8编码。
但我不确定在哪里定义编码。浏览网页,尤其是在这个论坛上,我发现了一些提示,但我仍然错过了一些基础知识。
有许多级别可以定义字符集:
- 操作系统范围
- MySQL范围:在MySQL INI文件和php.INI文件中
- 对于数据库:在create语句中
- 对于表:在create语句中
- 对于列:在create语句中
- 与mysql的连接:使用--default字符集=UTF8开关
我不清楚这个开关到底设置了什么
- 新创建的表的文本列是否受到影响,或者
- 检索文本数据时是否进行转换
- 还是别的什么
- 如果在my.ini、现有数据库或现有表中使用默认字符集=UTF8,是否需要这样做
Q1:我需要澄清一下。
在mysql中存在许多设置字符集的方法:
- 集合字符集
- 设置character_set_client
- 设置character_set_results
- 设置character_set_connection
- 集合名称
Q2:如果数据库字符集或表字符集定义正确,我需要以上命令吗?-它们是否取代了上面的启动选项?或者它们是用来改进交换机的?
更多问题:
-
如果在MySQL INI文件中定义了字符集(如utf8),是否需要使用上述命令和开关之一?
-
如果没有定义字符集,或者不是utf8(也许我无法控制它),那么创建一个使用utf8编码的数据库就足够了吗?在create和connect语句中省略任何字符集开关?
-
如果数据库无法定义字符集,那么为表设置字符集就足够了吗?还是必须为每个char/varch/text字段定义字符集?
我见过创建这样的表语句(NetBeans示例项目"TodoList"):
CREATE TABLE `todo` (
...
`title` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`comment` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`status` ENUM('PENDING', 'DONE', 'VOIDED') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'PENDING',
...
) ENGINE = MYISAM DEFAULT CHARSET=utf8;
问题6:CHARSET是为表和文本字段定义的,这不是多余的吗?
感谢您的澄清。
Q1-使用:mysql_query("SET NAMES utf8")结束连接脚本
Q2-是的。如果不使用此设置,则可以根据宿主(php.ini)的设置作为输出,其中可以设置默认字符编码
Q3-没有。表的默认字符集,字段可以有自己的,或者通常使用一个狭窄的规范(排序的语言差异等)。