DataGrip MySQL правильно хранит эмодзи, но отображает их как? - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблемы с просмотром смайликов в JetBrains DataGrip.В главном редакторе эмоджи выглядят просто отлично, как и в средстве просмотра базы данных SQLiteВ MySQL, однако, они выглядят как ?

. Мне пришлось тщательно выяснить, как заставить смайлики правильно хранить в MySQL.Я следовал многим руководствам, в которых говорилось, что ваш сервер, клиент, соединение, база данных, результаты, таблица и столбцы должны быть установлены в utf8mb4, а соответствующие параметры сортировки - utf8mb4_unicode_520_ci.Я сделал это и все еще имею те же результаты, то есть MySQL отображает смайлики как ?

Я дважды проверил переменные и получил эти результаты:

character_set_client        utf8mb4
character_set_results       utf8mb4
character_set_connection    utf8mb4
character_set_server        utf8mb4
character_set_database      utf8mb4
collation_server            utf8mb4_unicode_520_ci
collation_connection        utf8mb4_unicode_520_ci
collation_database          utf8mb4_unicode_520_ci

Затем я наткнулся наОтвет в сообществе JetBrains, в котором говорится, что вам, возможно, придется использовать кодировку следующим образом:

UPDATE content SET data = (_utf8mb4 '??') 
WHERE message_id = 45291;

Но, тем не менее, ошибка не исчезла.Затем я нашел этот маленький драгоценный камень, чтобы показать фактическое значение шестнадцатеричного кода столбца:

SELECT col, HEX(col), LENGTH(col), CHAR_LENGTH(col)
FROM table WHERE id = 1;

Результат был следующим:

col     HEX(col)            LENGTH()    CHAR_LENGTH(col)
??    F09F9899F09F9898    8           2

Ну, конечно же, столбец данных показываетсмайликиОбратите внимание, что эти результаты отображаются в консоли DataGrip.И, конечно же, шестнадцатеричное значение соответствует этим смайликам.Я проверил это с конвертером .

Это здорово!Сложная часть сделана.MySQL хранит мои данные правильно.Но когда я перехожу к фактической таблице в DataGrip, я все еще вижу значение как ??.

Что я делаю не так?

РЕДАКТИРОВАТЬ Вот средапеременные, используемые при подключении к моему серверу:

{
    "allowLoadLocalInfile": true,
    "allowMultiQueries": false,
    "allowNanAndInf": false,
    "allowUrlInLocalInfile": false,
    "alwaysSendSetIsolation": true,
    "autoClosePStmtStreams": false,
    "replicationConnectionGroup": "",
    "allowMasterDownConnections": false,
    "allowSlaveDownConnections": false,
    "readFromMasterWhenNoSlaves": false,
    "autoDeserialize": false,
    "autoGenerateTestcaseScript": false,
    "autoReconnect": true,
    "autoReconnectForPools": false,
    "blobSendChunkSize": 1048576,
    "autoSlowLog": true,
    "blobsAreStrings": false,
    "functionsNeverReturnBlobs": false,
    "cacheCallableStmts": false,
    "cachePrepStmts": false,
    "cacheResultsSetMetadata": false,
    "serverConfigCacheFactory": "com.mysql.jdbc.PerVmServerConfigCacheFactory",
    "cacheServerConfiguration": false,
    "callableStmtCacheSize": 100,
    "capitalizeTypeNames": true,
    "characterEncoding": "UTF-8",
    "characterSetResults": "UTF-8",
    "connectionAttributes": "",
    "clientInfoProvider": "com.mysql.jdbc.JDBC4CommentClientInfoProvider",
    "clobberStreamingResults": false,
    "clobCharacterEncoding": "",
    "compensateOnDuplicateKeyUpdateCounts": false,
    "connectionCollation": "",
    "connectionLifecycleInterceptors": "",
    "connectTimeout": 0,
    "continueBatchOnError": true,
    "createDatabaseIfNotExist": false,
    "defaultFetchSize": 0,
    "useServerPrepStmts": false,
    "dontTrackOpenResources": false,
    "dumpQueriesOnException": false,
    "dynamicCalendars": false,
    "elideSetAutoCommits": false,
    "emptyStringsConvertToZero": true,
    "emulateLocators": false,
    "emulateUnsupportedPstmts": true,
    "enablePacketDebug": false,
    "enableQueryTimeouts": true,
    "explainSlowQueries": false,
    "exceptionInterceptors": "",
    "failOverReadOnly": true,
    "gatherPerfMetrics": false,
    "generateSimpleParameterMetadata": false,
    "holdResultsOpenOverStatementClose": false,
    "includeInnodbStatusInDeadlockExceptions": false,
    "includeThreadDumpInDeadlockExceptions": false,
    "includeThreadNamesAsStatementComment": false,
    "ignoreNonTxTables": false,
    "initialTimeout": 2,
    "interactiveClient": false,
    "jdbcCompliantTruncation": true,
    "largeRowSizeThreshold": 2048,
    "loadBalanceStrategy": "random",
    "serverAffinityOrder": "",
    "loadBalanceBlacklistTimeout": 0,
    "loadBalancePingTimeout": 0,
    "loadBalanceValidateConnectionOnSwapServer": false,
    "loadBalanceConnectionGroup": "",
    "loadBalanceExceptionChecker": "com.mysql.jdbc.StandardLoadBalanceExceptionChecker",
    "loadBalanceSQLStateFailover": "",
    "loadBalanceSQLExceptionSubclassFailover": "",
    "loadBalanceEnableJMX": false,
    "loadBalanceHostRemovalGracePeriod": 15000,
    "loadBalanceAutoCommitStatementRegex": "",
    "loadBalanceAutoCommitStatementThreshold": 0,
    "localSocketAddress": "",
    "locatorFetchBufferSize": 1048576,
    "logger": "com.mysql.jdbc.log.StandardLogger",
    "logSlowQueries": false,
    "logXaCommands": false,
    "maintainTimeStats": true,
    "maxQuerySizeToLog": 2048,
    "maxReconnects": 3,
    "retriesAllDown": 120,
    "maxRows": -1,
    "metadataCacheSize": 50,
    "netTimeoutForStreamingResults": 600,
    "noAccessToProcedureBodies": false,
    "noDatetimeStringSync": false,
    "noTimezoneConversionForTimeType": false,
    "noTimezoneConversionForDateType": true,
    "cacheDefaultTimezone": true,
    "nullCatalogMeansCurrent": true,
    "nullNamePatternMatchesAll": true,
    "packetDebugBufferSize": 20,
    "padCharsWithSpace": false,
    "paranoid": false,
    "pedantic": false,
    "pinGlobalTxToPhysicalConnection": false,
    "populateInsertRowWithDefaultValues": false,
    "prepStmtCacheSize": 25,
    "prepStmtCacheSqlLimit": 256,
    "parseInfoCacheFactory": "com.mysql.jdbc.PerConnectionLRUFactory",
    "processEscapeCodesForPrepStmts": true,
    "profilerEventHandler": "com.mysql.jdbc.profiler.LoggingProfilerEventHandler",
    "profileSql": "",
    "profileSQL": false,
    "propertiesTransform": "",
    "queriesBeforeRetryMaster": 50,
    "queryTimeoutKillsConnection": false,
    "reconnectAtTxEnd": false,
    "relaxAutoCommit": false,
    "reportMetricsIntervalMillis": 30000,
    "requireSSL": false,
    "resourceId": "",
    "resultSetSizeThreshold": 100,
    "retainStatementAfterResultSetClose": false,
    "rewriteBatchedStatements": false,
    "rollbackOnPooledClose": true,
    "roundRobinLoadBalance": false,
    "runningCTS13": false,
    "secondsBeforeRetryMaster": 30,
    "selfDestructOnPingSecondsLifetime": 0,
    "selfDestructOnPingMaxOperations": 0,
    "replicationEnableJMX": false,
    "serverTimezone": "",
    "sessionVariables": ,
    "slowQueryThresholdMillis": 2000,
    "slowQueryThresholdNanos": 0,
    "socketFactory": "com.mysql.jdbc.StandardSocketFactory",
    "socksProxyHost": "",
    "socksProxyPort": 1080,
    "socketTimeout": 0,
    "statementInterceptors": "",
    "strictFloatingPoint": false,
    "strictUpdates": true,
    "overrideSupportsIntegrityEnhancementFacility": false,
    "tcpNoDelay": true,
    "tcpKeepAlive": true,
    "tcpRcvBuf": 0,
    "tcpSndBuf": 0,
    "tcpTrafficClass": 0,
    "tinyInt1isBit": false,
    "traceProtocol": false,
    "treatUtilDateAsTimestamp": true,
    "transformedBitIsBoolean": false,
    "useBlobToStoreUTF8OutsideBMP": false,
    "utf8OutsideBmpExcludedColumnNamePattern": "",
    "utf8OutsideBmpIncludedColumnNamePattern": "",
    "useCompression": false,
    "useColumnNamesInFindColumn": false,
    "useConfigs": "",
    "useCursorFetch": false,
    "useDynamicCharsetInfo": true,
    "useDirectRowUnpack": true,
    "useFastIntParsing": true,
    "useFastDateParsing": true,
    "useHostsInPrivileges": true,
    "useInformationSchema": false,
    "useJDBCompliantTimezoneShift": false,
    "useLocalSessionState": false,
    "useLocalTransactionState": false,
    "useLegacyDatetimeCode": true,
    "sendFractionalSeconds": true,
    "useNanosForElapsedTime": false,
    "useOldAliasMetadataBehavior": false,
    "useOldUTF8Behavior": false,
    "useOnlyServerErrorMessages": true,
    "useReadAheadInput": true,
    "useSqlStateCodes": true,
    "useSSL": false,
    "useSSPSCompatibleTimezoneShift": false,
    "useStreamLengthsInPrepStmts": true,
    "useTimezone": false,
    "ultraDevHack": false,
    "useUnbufferedInput": true,
    "useUnicode": true,
    "useUsageAdvisor": false,
    "yearIsDateType": false,
    "zeroDateTimeBehavior": "convertToNull",
    "useJvmCharsetConverters": false,
    "useGmtMillisForDatetimes": false,
    "dumpMetadataOnColumnNotFound": false,
    "clientCertificateKeyStoreUrl": "",
    "trustCertificateKeyStoreUrl": "",
    "clientCertificateKeyStoreType": "JKS",
    "clientCertificateKeyStorePassword": "",
    "trustCertificateKeyStoreType": "JKS",
    "trustCertificateKeyStorePassword": "",
    "verifyServerCertificate": true,
    "useAffectedRows": false,
    "passwordCharacterEncoding": "",
    "maxAllowedPacket": -1,
    "authenticationPlugins": "",
    "disabledAuthenticationPlugins": "",
    "defaultAuthenticationPlugin": "com.mysql.jdbc.authentication.MysqlNativePasswordPlugin",
    "disconnectOnExpiredPasswords": true,
    "getProceduresReturnsFunctions": true,
    "detectCustomCollations": false,
    "serverRSAPublicKeyFile": "",
    "allowPublicKeyRetrieval": false,
    "dontCheckOnDuplicateKeyUpdateInSQL": false,
    "readOnlyPropagatesToServer": true,
    "enabledSSLCipherSuites": "",
    "enabledTLSProtocols": "",
    "enableEscapeProcessing": true
}

РЕДАКТИРОВАТЬ Вот несколько снимков экрана, которые помогут вам понять, что я вижу:

Когда я перехожу к записи черезпредставление таблицы базы данных (? вместо смайликов): no-emoji

Когда я выполняю запрос, чтобы выбрать ту же запись и просмотреть ее в консоли (смайлики отображаются как смайлики): emoji-console

1 Ответ

0 голосов
/ 22 февраля 2019

Это пока невозможно в DataGrip, но может быть решено после реализации этой функции: https://youtrack.jetbrains.com/issue/DBE-2606

...