GreatSQL社区

搜索

默认字符集修改了为什么没有生效

214 7 2025-6-12 14:13
建表的时候遇到一个问题,我用的字符集在数据库层面已经设置了,但是创建表还是得表字符集写上,默认的没有生效。


my.cnf中的配置:


数据库中查出来的:



建表语句:


这样的话,理论上这张表的排序规则应该是:utf8mb4_general_ci
但是他会默认改成:utf8mb4_0900_ai_ci


是不是还有别的地方能修改这个配置啊,我从网上也没有找到还有别的配置参数。


全部回复(7)
yejr 2025-6-13 08:53:23
建表DDL中只指定CHARSET=utf8mb4的话,那么默认对应的COLLATE是从database层继承过来的,如果默认是 utf8mb4_0900_ai_ci,那么说明这个table所在的database的COLLATE已经设定为 utf8mb4_0900_ai_ci。

也就是说,你这个table所在的database可能是你修改全局 COLLATE 设定前已经创建好的了。

你可以尝试在修改完全局 COLLATE 设定后,新建一个DB,然后在该DB下再新建TABLE,这时候应该会如你所愿。

最后,“CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci”是默认的对应关系,不建议在 CHARSET=utf8mb4 时修改 COLLATE=utf8mb4_general_ci,可能会带来其他未知影响。
baguai 2025-6-13 09:10:24
154、 注意这里说的是必须带上 CHARACTER SET utf8mb4 这种,否则还是collation_server
default_collation_for_utf8mb4
确实可以修改,也能够改变utf8mb4默认的collate,但是没有参数设置

      Introduces a new system variable default_collation_for_utf8mb4 with two
       possible values: utf8_general_ci and utf8mb4_0900_ai_ci.
       The value of the new variable is used as a default implicit collation
       values if the character set is utf8mb4 in:
   
       * SET NAMES utf8mb4  注意也会影响set names的行为
   
       * _utf8mb4 '...', _utf8mb4 x... and _utf8mb4 b... literals
   
       * CREATE/ALTER SCHEMA/DATABASE ... CHARACTER SET utf8mb4
   
       * CREATE/ALTER TABLE ... DEFAULT CHARACTER SET utf8mb4
   
       * ALTER TABLE ... /CONVERT TO CHARACTER SET utf8mb4
   
       * table column definitions in CREATE/ALTER TABLE
   
       * SP/SF/trigger/event parameter, local variable and return value declarations
   
       * SHOW COLLATION and SHOW CHARACTER SET output
      
    Revert "Bug #27959941: DEFAULT_COLLATION_FOR_UTF8MB4 CAN'T BE SET FROM CONFIGURATION FILE"
   
    The default_collation_for_utf8mb4 system variable is intended for internal use by replication.
    Thus, it doesn't have command line and configuration file option counterparts.


因为这种建表的时候并不是依赖collation_server,只要带了字符集utf8mb4就会使用默认的字符集,因此除了collation_server
控制默认建库建表行为,因为默认建库不会带字符集,还需要控制mysqldump和建表加字符集后使用的默认collation问题。
因此在
init_connect = 'SET default_collation_for_utf8mb4=utf8mb4_general_ci'
这样设置,这样设置管理员账户不生效,主要是含有super和connect_admin权限的用户不生效,普通用户是生效的。
但是这个参数官方说的是只是内部参数。   


但是对于collation_connection 并不生效,但是这个值影响的字变量,影响不大,会转换
mysql> show variables like '%coll%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_ai_ci |
| collation_database            | utf8mb4_general_ci |
| collation_server              | utf8mb4_general_ci |
| default_collation_for_utf8mb4 | utf8mb4_general_ci |
+-------------------------------+--------------------+

需要设置一下也加入到init_connect 中如下

init_connect = 'SET default_collation_for_utf8mb4=utf8mb4_general_ci;set names utf8mb4'
或者
init_connect = 'SET default_collation_for_utf8mb4=utf8mb4_general_ci;set collation_connection=utf8mb4_general_ci'
乘晚风 2025-6-13 09:18:24
yejr 发表于 2025-6-13 08:53
建表DDL中只指定CHARSET=utf8mb4的话,那么默认对应的COLLATE是从database层继承过来的,如果默认是 utf8mb ...

重新测试了一下,建库的时候不指定字符集,是系统上配置的。正常来说cs这个库的默认字符集是COLLATE=utf8mb4_general_ci,但是建表了之后还是utf8mb4_0900_ai_ci,还有别的地方有问题吗?
mysql> create database cs;
Query OK, 1 row affected (0.03 sec)

mysql> show create database cs;
+----------+------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                              |
+----------+------------------------------------------------------------------------------------------------------------------------------+
| cs       | CREATE DATABASE `cs` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> use cs;
Database changed
mysql> CREATE TABLE `t_local2` (
    ->   `id_key` varchar(20) NOT NULL,
    ->   `detail` varchar(50) DEFAULT NULL,
    ->   `memo` varchar(100) DEFAULT NULL,
    ->   PRIMARY KEY (`id_key`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.23 sec)

mysql> show create table t_local2;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                    |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_local2 | CREATE TABLE `t_local2` (
  `id_key` varchar(20) NOT NULL,
  `detail` varchar(50) DEFAULT NULL,
  `memo` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
yejr 2025-6-13 09:21:46
乘晚风 发表于 2025-6-13 09:18
重新测试了一下,建库的时候不指定字符集,是系统上配置的。正常来说cs这个库的默认字符集是COLLATE=utf8 ...

执行下面的命令查看
  1. greatsql> show variables like 'collation_%';
  2. +----------------------+--------------------+
  3. | Variable_name        | Value              |
  4. +----------------------+--------------------+
  5. | collation_connection | utf8mb4_0900_ai_ci |
  6. | collation_database   | utf8mb4_0900_ai_ci |
  7. | collation_server     | utf8mb4_0900_ai_ci |
  8. +----------------------+--------------------+

  9. greatsql> \s
  10. --------------
  11. mysql  Ver 8.0.32-26 for Linux on x86_64 (GreatSQL, Release 26, Revision a68b3034c3d)

  12. Connection id:          183
  13. Current database:       performance_schema
  14. Current user:           root@localhost
  15. SSL:                    Not in use
  16. Current pager:          stdout
  17. Using outfile:          ''
  18. Using delimiter:        ;
  19. Server version:         8.0.32-27 GreatSQL, Release 27, Revision aa66a385910
  20. Protocol version:       10
  21. Connection:             Localhost via UNIX socket
  22. Server characterset:    utf8mb4
  23. Db     characterset:    utf8mb4
  24. Client characterset:    utf8mb4
  25. Conn.  characterset:    utf8mb4
复制代码


有可能是 collation_connection、collation_database、collation_server 这三个设置不一样
Uest 2025-6-13 09:23:34
乘晚风 发表于 2025-6-13 09:18
重新测试了一下,建库的时候不指定字符集,是系统上配置的。正常来说cs这个库的默认字符集是COLLATE=utf8 ...

https://dev.mysql.com/doc/refman ... stem-variables.html
The default utf8mb4 collation(default_collation_for_utf8mb4) is used in the following statements:

SHOW COLLATION and SHOW CHARACTER SET.

CREATE TABLE and ALTER TABLE having a CHARACTER SET utf8mb4 clause without a COLLATION clause, either for the table character set or for a column character set.

CREATE DATABASE and ALTER DATABASE having a CHARACTER SET utf8mb4 clause without a COLLATION clause.

Any statement containing a string literal of the form _utf8mb4'some text' without a COLLATE clause.
Uest 2025-6-13 09:36:49
baguai 发表于 2025-6-13 09:10
154、 注意这里说的是必须带上 CHARACTER SET utf8mb4 这种,否则还是collation_server
default_collation_ ...

set global default_collation_for_utf8mb4=
utf8mb4_general_ci;
会导致查询sys库部分视图(比如sys.statement_analysis)报错ERROR1267(HY000):Illegalmixof
collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for
operation '='
需要手工处理下
yejr 2025-6-13 10:15:13
Uest 发表于 2025-6-13 09:36
set global default_collation_for_utf8mb4=
utf8mb4_general_ci;
会导致查询sys库部分视图(比如sys.sta ...

是啊,所以说不要轻易修改默认的字符集和校验集对应关系
乘晚风

3

主题

0

博客

11

贡献

新手上路

Rank: 1

积分
16

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-6-22 03:41 , Processed in 0.021500 second(s), 16 queries , Redis On.
快速回复 返回顶部 返回列表