Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接字符串中的字符编码是否设置了值的存储方式?_Mysql_Grails_Jdbc_Character Encoding - Fatal编程技术网

Mysql 连接字符串中的字符编码是否设置了值的存储方式?

Mysql 连接字符串中的字符编码是否设置了值的存储方式?,mysql,grails,jdbc,character-encoding,Mysql,Grails,Jdbc,Character Encoding,我要将数据库的编码从latin1更改为utf8mb4。 由于隐私限制,我不知道要转换的数据库包含什么。我担心在SQL下面运行,现有数据可能会被更改 ALTER TABLE TABLE转换为字符集utf8 COLLATE utf8\u general\u ci 但是,grails应用程序中的连接字符串包含useUnicode=true&characterEncoding=UTF-8,这是否意味着即使列使用latin1_swedish_ci,保存的实际值也是UTF-8编码的 由于该值是UTF-8编码

我要将数据库的编码从latin1更改为utf8mb4。 由于隐私限制,我不知道要转换的数据库包含什么。我担心在SQL下面运行,现有数据可能会被更改

ALTER TABLE TABLE转换为字符集utf8 COLLATE utf8\u general\u ci


但是,grails应用程序中的连接字符串包含useUnicode=true&characterEncoding=UTF-8,这是否意味着即使列使用latin1_swedish_ci,保存的实际值也是UTF-8编码的

由于该值是UTF-8编码的,因此数据不会受到从latin1到utf8mb4的更改的影响

+--------------------------+-------------------+
| Variable_name            | Value             |
+--------------------------+-------------------+
| character_set_client     | utf8              |
| character_set_connection | utf8              |
| character_set_database   | latin1            |
| character_set_filesystem | binary            |
| character_set_results    | utf8              |
| character_set_server     | latin1            |
| character_set_system     | utf8              |
| collation_connection     | utf8_general_ci   |
| collation_database       | latin1_swedish_ci |
| collation_server         | latin1_swedish_ci |
+--------------------------+-------------------+```

那是
πα?这是
UTF-8
(外界称之为)、
utf8mb4
(MySQL的等效版本)或
utf8
(MySQL部分实现UTF-8)中的解释

它在
latin1
中无法正常工作

客户机中的编码和数据库中列的编码不必相同。但是,不能将客户机中的希腊语填充到表中的拉丁语1中,因此会显示错误消息

什么
ALTER TABLE TABLE转换为字符集utf8 COLLATE utf8\u general\u ci
的作用是将该表中的所有文本列更改为utf8编码,并从当前使用的任何编码(大概是拉丁语1)转换。这适用于西欧字符,所有这些字符(使用不同的编码)都有拉丁文1和utf8

要处理表情符号和一些中文,您最好选择
utf8mb4

ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_unicode_520_ci;

“这是否意味着即使拉丁语1_-swedish_ci用于列,已保存的实际值也是UTF-8编码的?”-不。有很多这样的问题,当列字符集为拉丁语1(或类似字符集)时,为什么像
πα
这样的值会作为
存储在数据库中。连接字符串参数告诉服务器发送的字符串是Unicode(编码为UTF-8),但拉丁1字符集不包括这些字符,因此在将这些字符写入列时,它们会转换为问号。感谢您的回答。当尝试通过应用程序接口插入latin1不支持的字符时,应用程序返回一条错误消息,说明“字符串值不正确:'\xCE\x8F\xCF\x80\xCE\xB1”。这让我更加确信,latin1不支持的字符永远不会作为问号出现在数据库中。这会改变你回答的问题的答案吗?关键点是一样的:如果一个列被定义为latin1,那么它将只包含latin1编码的字符串。将列从latin1转换为utf8mb4可能会更改字符串的编码,但不会更改其值,例如,“André”将保留为“André”,即使“é”的编码不同。谢谢!在转换之前尝试写入所有可能的字符,并且可以成功转换而不会损坏数据