需要澄清SET NAMES指令和character_set变量



最近,我需要在我的DB (MySQL/MariaDB)的一些表中存储表情符号,所以经过一些研究,我发现我使用的编码(UTF8)是不够的,我需要移动到UTF8-mb4。然后,我将需要的表的字符集更改为新的编码,但显然这还不够。我也改变了我的连接字符串,我在创建一个新的DbConnection时使用,指定编码utf8mb4,我仍然无法保存emojy。最后,我在MySQL中使用utf8mb4找到了这个答案,这建议使用SET NAMES指令。这解决了我的问题,但我注意到,指令是活跃的,直到我重新启动数据库服务。我想知道:

  1. 这究竟是使用SET NAMES指令的效果,特别是对于使用旧的utf8编码的表?
  2. 哪个是正确的使用方式?(在我的。ini或在我的代码?)
  3. 这个说明有什么需要我担心的吗?
  4. 是否有其他方法来设置character_set_client和character_set_connection到utf8mb4?
  1. SET NAMES命令的效果在MySQL手册中指定:它将这三个系统变量设置为指定的值:
  • character_set_client
  • character_set_connection
  • character_set_results

它不能对使用旧utf8排序的表产生任何影响,因为表情符号不能存储在该编码中;数据丢失。对于新表,它可能会影响服务器如何解释客户端发送的字符串字面量(character_set_connection)以及如何从表中检索表情符号发送回客户端(character_set_results)。

  1. 你永远不需要在你的代码中显式地使用它。一个正确的客户端库将通过客户端发送的握手响应包为您设置这个值,如果服务器为连接切换到不同的字符集,也可以根据需要设置这个值。MySqlConnector在这方面有正确的行为,我建议切换到它。(免责声明:第一作者)

  2. 不,让你的客户端库为你照顾它。

  3. 是的,在握手响应包中,但这是您正在使用的客户端库的实现细节。您也可以使用SET @@character_set_connection = 'utf8mb4';这样的语句来设置它们。

相关内容

  • 没有找到相关文章

最新更新