繁体   English   中英

Rails应用程序的utf8mb4字符集

[英]utf8mb4 character set for Rails application

我正在使用MySQL版本5.7.12; 我正在尝试在文本字段中添加表情符号支持。 我找到了这篇文章。 它指出要更改表和列以启用utf8mb4,它支持真正的unicode,包括4字节unicode字符。 我有一个表注释和文本字段内容,因此我执行以下操作:

class ConvertCommentsToUtf8mb4 < ActiveRecord::Migration
  def change
    # for each table that will store unicode execute:
    execute "ALTER TABLE comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
    # for each string/text column with unicode content execute:
    execute "ALTER TABLE comments CHANGE content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
  end
end

当我尝试运行迁移时,出现以下错误:

Mysql2 :: Error:您的SQL语法有错误; 在第1行的'SET utf8mb4 COLLATE utf8mb4_bin'附近,请检查与您的MySQL服务器版本相对应的手册以使用正确的语法:ALTER TABLE注释更改内容TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin / Users / myuser / .rvm / gems / ruby​​- 2.1.2@core/gems/mysql2-0.3.21/lib/mysql2/client.rb:80:在_query中

我可能做错了什么?

当您使用ALTER TABLE...CHANGE您需要输入两次列名,因为CHANGE允许您更改列名。

ALTER TABLE comments CHANGE content TEXT CHARACTER SET ...

在这种情况下,它认为您正在将列名称更改为TEXT,数据类型为CHARACTER(这是合法数据类型,它是CHAR(1)的同义词),然后在找到单词SET时感到困惑。

因此,您可以通过以下两种方式之一对其进行修复:

ALTER TABLE comments CHANGE content content TEXT CHARACTER SET ...

ALTER TABLE comments MODIFY content TEXT CHARACTER SET ...

MODIFY就像CHANGE一样,但是不能更改列的名称,因此您不需要两次拼出列名。

这就是语法错误的解释,但是FWIW您不需要在对整个表使用CONVERT TO CHARACTER SET之后修改文本列。 MySQL自动更改表中所有字符串列的字符集和排序规则。


演示:

mysql> create table comments ( content text ) character set utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> alter table comments convert to character set utf8mb4;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into comments set content = 0xF09F92A9;
Query OK, 1 row affected (0.01 sec)

mysql> select * from comments;
+---------+
| content |
+---------+
| 💩        |
+---------+
sql = "ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4  
COLLATE utf8mb4_unicode_ci;"
records_array = ActiveRecord::Base.connection.execute(sql)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM