Mariadb不会将CHARACTER_SET_RESULTS从latin1更改为utf8

时间:2019-12-13 21:16:25

标签: mysql vagrant mariadb

我正在使用5.5.64-MariaDB MariaDB服务器。我一生都无法将character_set_results更改为utf8。我尝试过ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;,我也尝试过SET SESSION CHARACTER_SET_CLIENT = utf8mb4; SET SESSION CHARACTER_SET_RESULTS = utf8mb4;

然后我进入my.cnf,看起来像这样

[mysqld]
datadir                         = /var/database/db
innodb_flush_log_at_trx_commit  = 2
query_cache_size                = 16M
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
character_set_server   = utf8mb4
collation_server       = utf8mb4_unicode_ci
character_set_client: utf8mb4
character_set_database: utf8mb4
character_set_results: utf8mb4
character_set_connection: utf8mb4
character_set_server: utf8mb4

更改my.cnf后,我重新启动了mariadb,并且成功。

当我运行mysqladmin -u root -p var | grep -E 'character|collation' | tr -s ' '时,我得到了

[vagrant@localhost vagrant]$ mysqladmin -u root -p var | grep -E 'character|collation' | tr -s ' '
Enter password:
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |

如何更改CHARACTER_SET_RESULTS?我也尝试过SET SESSION CHARACTER_SET_RESULTS = utf8mb4;SET character_set_results = utf8mb4;,但是当我运行Java集成测试时,它一直会重置为latin1。我检查了我的项目,找不到latin1。我不知道为什么它会一直重置为latin1,以及如何将其更改为utf8。有任何想法吗?我不认为将mariadb升级到10.X会有帮助,但是如果有人遇到这个问题,那是解决方案,我会试一试

2 个答案:

答案 0 :(得分:1)

全局设置正确,但是,当客户端连接到服务器时,客户端会强制服务器更改字符集(默认情况下,客户端工具和Connector / C使用的是latin1)。

mysqladmin的输出显示会话变量已更改为latin1,因为在连接握手期间mysqladmin告诉服务器使用latin1。

mysqladmin不会从[mysqld]读取值,而是从[mysql],[client]和[mysqladmin]组读取值。

如果要强制所有客户端使用utf8mb4,可以在[mysqld]部分中执行此操作:

例如 init_connect=set names utf8mb4

skip-character-set-client-handshake

答案 1 :(得分:0)

ALTER DATABASEALTER TABLE仅更改默认设置。

要将一个表中的所有字符串列转换为utf8mb4:

ALTER TABLE tbl_name CONVERT TO utf8mb4;

要转换一列:

ALTER TABLE tbl_name MODIFY col_name ... CHARACTER SET utf8mb4 ...;

...是其他任何东西,例如VARCHAR(...)NOT NULL

警告:这些假定列中的编码与声明匹配(例如latin1)。如果没有,上述更改将使情况变得更糟。

正确完成后,将一字节重音的latin1字母转换为对应的2字节utf8mb4字母。

某些情况:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

由于您仍然使用5.5,因此如果您使用VARCHAR(255)(或191以上的值),可能还会遇到其他问题。参见:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

相关问题