我正在使用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会有帮助,但是如果有人遇到这个问题,那是解决方案,我会试一试
答案 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 DATABASE
和ALTER 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