[英]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.